首页 > 编程语言 > 详细

java点滴之volatile关键字特性

时间:2014-05-09 21:06:41      阅读:433      评论:0      收藏:0      [点我收藏+]

一 问题引入

JVM把内存分为两层,一层为大的主存,另外一个是工作内存(属于每个线程自己专属的),正常情况下,线程在用到某个变量的值时,都是先取到工作内存中进行处理,然后再写回主存,这样就会带来不同线程变量值不同步的问题。
volatile字面意思是易挥发,不稳定,比如100个线程同时访问修改的一个字段值,那么这种值的特性明显和JVM中高速缓存机制不相符,这种值是不适合放在各线程自己的寄存器中的,那会导致100个线程中持有的副本都不一样。

volatile修饰符作用    

当一个变量被声明成 volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对该变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的 volatile 变量值都相同。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。

三注意事项

用于对基本变量(整数、布尔变量等)的单个实例的访问。
一个变量经 volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。
理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。 
声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作: 
n = n + 1; n++;
如果要想使这种情况变成原子操作,需要使用synchronized关键字包裹这些语句。

java点滴之volatile关键字特性,布布扣,bubuko.com

java点滴之volatile关键字特性

原文:http://blog.csdn.net/lskshz/article/details/25388945

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!