错误示例
public class DoubleCheckedLocking {
/**
* 单例.
*/
private static Instance instance;
/**
* 获取单例.
* @return 对象.
*/
public static Instance getInstance() {
if (instance == null) {
synchronized (DoubleCheckedLocking.class) {
if (instance == null) {
instance = new Instance(); // 问题根源.
}
}
}
return instance;
}
}
问题根源
instance = new Instance(); 指令重排序
期望顺序
memory = allocate(); //1、分配对象的内存空间
ctorInstance(memory);//2、初始化对象
instance = memory; //3、设置instance 指向内存地址
可能重排序
memory = allocate(); //1、分配对象的内存空间
instance = memory; //3、设置instance 指向内存地址
// !!!注意:此时对象还未初始化
ctorInstance(memory);//2、初始化对象
解决方案
1、volatile 域
2、类的初始化
1、volatile 域
/**
* 单例.
*/
private static volatile Instance instance;
2、类的初始化
/**
* 单例.
*/
private static Instance instance = new Instance();