(转)Java并发编程笔记(四)之 Volatile

来源:互联网 发布:大数据在零售业的应用 编辑:程序博客网 时间:2024/06/07 04:39
推荐博客:


Java并发编程:volatile关键字解析

但是在这篇博客中关于解释Volatile的不保证变量操作的原子性,有点问题。

作者用例:

public class Test {    public volatile int inc = 0;         public void increase() {        inc++;    }         public static void main(String[] args) {        final Test test = new Test();        for(int i=0;i<10;i++){            new Thread(){                public void run() {                    for(int j=0;j<1000;j++)                        test.increase();                };            }.start();        }                 while(Thread.activeCount()>1)  //保证前面的线程都执行完            Thread.yield();        System.out.println(test.inc);    }}

不为10000的原因应该是这样的。自增操作分为三部分:读取inc,inc+1,将inc写入。现假设inc = 10,线程1进行到第二步,此时inc=11,线程1阻塞掉了;切换到线程2执行,

因为被Volatile关键字修饰,此时线程2读取出的inc为11,自增后为13,然后阻塞;切换回线程1,线程1进行第三步,将inc的值写入主存中。




0 0