zoukankan      html  css  js  c++  java
  • JAVA 堆栈知识和Volatile关键字

    以下两个程序均不能达到预期效果(即num=100的期望)

    package com.test.thread;
    
    public class VolatileSample {
        private static int num=0;
        public static void main(String[] args) {
            
            for (int i = 0; i < 100; i++) {
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        num++;
                        
                    }
                }).start();
            }
            System.out.println("num: "+num);
        }
    }

    上面的程序无法总是得出正确的结果,是因为一个任务做出地修改,即使在不中断地意义上讲是原子性的,对其他任务也可能是不可视的(例如,修改只是暂时性地存储在本地处理器地缓存中),因此不同的任务对应用的状态有不同的视图。另一方面,同步机制强制在处理器系统中,一个任务做出的修改必须在应用中是可视的。如果没有同步机制,那么修改时可视将无法确定。

    public class Client {
        private static volatile int num = 0;
        public static void main(String[] args) {
    
            for (int i = 0; i < 100; i++) {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        num++;
    
                    }
                }).start();
            }
            System.out.println("num: " + num);
        }
    }

    上面的程序中,num虽然对各个线程具有可视性,但是num++却不是原子操作。

  • 相关阅读:
    再谈Dilworth定理
    区间动态规划
    单调队列优化动态规划
    暑假集训考试R2 konomi 慕
    NOIP 2000 计算器的改良
    2007 Simulation message
    COCI 2003 LIFTOVI 电梯 SPFA
    NOIP 2003 数字游戏
    USACO 2014 DEC Guard Mark 状态压缩
    使用HttpClient发送GET请求
  • 原文地址:https://www.cnblogs.com/heben/p/5746610.html
Copyright © 2011-2022 走看看