这是Java 双重检查锁定的后续。
下面的代码片段有 2 个有趣的特征。
1) 在对象准备好使用之前,它需要调用一个单独的 init() 方法。所以 volatile 没有帮助(我知道,为什么不直接将 init() 中的代码放入构造函数中?这里是为了说明的目的)。
2)它使用 tmp 变量进行初始化,并在初始化完成后分配给实例。
if (instance == null) {
synchronized (mutex) {
if (instance == null) {
AClass tmpInstance = new AClass();
tmpInstance.init();
instance = tmpInstance;
}
}
}
那么,这是否会受到重新排序问题的影响,即可以在调用 tmpInstance.init() 之前将实例分配给 tmpInstance 吗?
谢谢,丰富