关于懒汉模式双重检查中,添加volatile的问题

来源:13-12 JMM的应用

JackyXie

2020-11-25

   前面老师说到synchronized可以保证可见性。那么即使初始化实例的三个操作发生了重排序,构造方法中的赋值也应该是可见的(该方法也在synchronized内),为什么会导致使用的实例的属性为默认值?
   对比您前面讲的volatile作为刷新之前变量的触发器中的生产环境代码。线程A的对象也经历了初始化的过程,可能也会发生重排序,但是在initialized被置为true的时候,线程A的操作对线程B是可见的,线程A中的内容都可以被B正确读取到。那synchronized可以保证可见性为什么在上面的问题就不行了呢?
写回答

1回答

悟空

2020-11-26

在出synchronized代码块时,其中的所有步骤都可以保证做完,但是,这里的问题是,在第一个线程退出synchronized之前,里面的操作执行了一部分,比如执行了new却还没执行构造函数,然后第一个线程被切换走了。这时第二个线程看到的对象就是非空或者是不想要的值,所以会报错。

0
1
JackyXie
好的,谢谢老师!
2020-12-06
共1条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程