1. class Foo {
2. private Helper helper = null;
3. public Helper getHelper() {
4. if (helper == null) {
5. synchronized(this) {
6. if (helper == null) {
7. helper = new Helper();
8. }
9. }
10. }
11. return helper;
12. }
13. }
这种结构被认为是损坏的原因通常描述为编译器完成的赋值重新排序,以便在写入助手变量后调用助手构造函数。我的问题是,这段代码是如何线程安全的,以下步骤是否可行?
- 线程 1,进入同步块,发现 helper 为空。
- 线程1,此时放弃监视器
- 线程2,进入对象监视器并实例化助手
- 线程 1,返回并重新初始化助手实例
我看不出这个解决方案比单检查锁定更好。