记得早前本人写过一篇关于C关键字volatile一点认知文章
由于最近因业务需要一直在做与java相关的开发。故研究了一下java里的volatile这里与C里的大致相同(注:以下如未特殊说明所有volatile都指java里为主)。
java的内存交互用java的指令分为:lock、unlock、read、load、use、assign、store、write这8种。
其中lock、unlock是同步锁所产生的(如:synchronized、com.util.concurrent中的原子类)。
默认java会开启优化模式,也就是说后6种操作(read、load、use、assign、store、write)都可能是无序的。
好了,java内存加载大致就是这样。
volatile的作用就是【read、load、use】与【assign、store、write】这每组里面的操作都是有序的。也就是说不要让java优化。
网上也说了很多volatile为啥不是线程安全的,其实说白了上面的二元组中间可以插入其它操作,如:
public class VolatileTest { public static volatile int race = 0; public static void raceIncr() { race++; } }
这里如果调用receIncr方法会大致执行以下操作:
read、load、use、iconst_1、iadd、assign、store、write
那么这里iconst_1、iadd对其它线程来说并不是可见的。。。
故总结,常用还是赋值吧。。