java并发编程实践--原子变量、volatile、synchornized

         volatile是一种同步的弱形式,volatile变量,它可以确保当一个变量的更新对其他线程的可见性,即修改一个volatile变量时,其他线程是可以获取到修改后的新值。当一个域被声明为volatile类型后,编译器与运行时会监控这个变量:它是共享的,而且对它的操作不会与其他的内在操作一起被重排序所以读一个volatile变量时,总会返回由某一线程所写入的最新值

         volatile一般用于检查状态标记。因为别的线程修改volatile变量时,其它线程可以立即获取到修改后的值,以便确定是否退出一个循环。

         volatile变量固然方便,但也有局限:volatile的语义不足以使变量自增操作原子化,除非你能保证只有一个线程对变量执行操作。

         而原子变量是提供了“读-改-写”原子操作的支持,所以原子变量是”更优的volatile变量“。

        加锁(原子变量)可以保证可见性和原子性。而volatile变量只能保证可见性。

        volatile为何没的提交对变量自增操作的原子化。原因如下:

在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,

线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存

变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,

在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。下面一幅图

描述这写交互

java并发编程实践--原子变量、volatile、synchornized_第1张图片


参考资料:1.http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

                    2.《java并发编程实践》


你可能感兴趣的:(并发编程)