volatile怎样做到防止类初始化时jvm重排序?

来源:4-3 安全发布对象-四种方法-2

_庆城

2018-09-24

volatile的本质是每次涉及到变量读写的时候都把变量值在工作内存和主内存之间进行同步。单例初始化的时候,1.分配对象内存空间 memory = allocate(); 2.初始化对象 ctorInstance(); 3.设置对象实例指向刚刚分配的内存 instance = memory; 这三步是怎样通过volatile特性达到不重排序的?

写回答

1回答

Jimin

2018-09-24

你好,当有volatile时,就会限制这里的重排序,这是jmm里约定的,并由jdk来保证的,本质上是volatile修饰的变量对应的读写操作在生成cpu指令时不允许编译器进行重排序,这是和其他变量的区别,除了限制重排序之外,还会额外插入内存屏障,来保证可见性。

1
1
_庆城
非常感谢!
2018-09-24
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程