Loading

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++却不是原子操作。

posted @ 2016-08-07 16:53  注销111  阅读(298)  评论(0编辑  收藏  举报