volatile怎样做到防止类初始化时jvm重排序?
来源:4-3 安全发布对象-四种方法-2
![](http://img1.sycdn.imooc.com/user/5ba4738b0001068807410741-100-100.jpg)
_庆城
2018-09-24
volatile的本质是每次涉及到变量读写的时候都把变量值在工作内存和主内存之间进行同步。单例初始化的时候,1.分配对象内存空间 memory = allocate(); 2.初始化对象 ctorInstance(); 3.设置对象实例指向刚刚分配的内存 instance = memory; 这三步是怎样通过volatile特性达到不重排序的?
写回答
1回答
-
你好,当有volatile时,就会限制这里的重排序,这是jmm里约定的,并由jdk来保证的,本质上是volatile修饰的变量对应的读写操作在生成cpu指令时不允许编译器进行重排序,这是和其他变量的区别,除了限制重排序之外,还会额外插入内存屏障,来保证可见性。
112018-09-24
相似问题