关于java的volatile

记得早前本人写过一篇关于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对其它线程来说并不是可见的。。。

故总结,常用还是赋值吧。。

原文地址:https://www.cnblogs.com/tywei/p/7552783.html