单例双重检测为什么会出现线程安全问题?
来源: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直接返回这个未初始化完成的 对象 去进行后续操作。这样就出现了线程不安全问题。突然觉得之前的理解有些蠢了。。。。
10
相似问题
关于多线程下的双重检测模式
回答 2
单例双重检测第二个判空的作用
回答 1