单例双重检测为什么会出现线程安全问题?

来源:9-5 jmm的内存可见性

慕数据5088220

2020-12-02

老师你好,在9-5中的单例双重检测实现中,为什么会出现线程安全问题(就是这个线程安全问题具体是什么一种情况)?我这样理解对吗?
就是假设线程1最先执行,然后instance == null 用类锁方式锁住了该类对象,然后去执行 new Singleton()。但是此时 线程2 开始执行,到第一次检测时,可能 线程1 需要new 对象并没有初始化完成,所以instance 依旧是null 然后又去新生成一个 实例。这样的话很有可能就是创建了多个实例,并不是单例了。
重排序之后 初始化对象放到最后执行,但是在第二步也就是3操作,的时候此时instance 已经是 != null 了,那是不是意味着线程2并不会去执行第一次检测了?那这样为什么会有线程安全问题?

初学者有点迷,一时头脑转不过弯,还请老师解惑,感谢

写回答

1回答

慕数据5088220

提问者

2020-12-02

突然理解了,也就是 重排序后 new Singleton()可能没有初始化完成,只是执行到了操作3,此时 instance  != null了,所以线程2直接返回这个未初始化完成的 对象 去进行后续操作。这样就出现了线程不安全问题。突然觉得之前的理解有些蠢了。。。。

1
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程