关于懒汉模式双重检查中,添加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却还没执行构造函数,然后第一个线程被切换走了。这时第二个线程看到的对象就是非空或者是不想要的值,所以会报错。
012020-12-06
相似问题