class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (null == instance) {
synchronized (Singleton.class) {
if (null == instance) {
instance = new Singleton();
}
}
}
return instance;
}
}
加 volatile
是因为 实例化对象在JVM指令里是三个指令:
1. 分配内存空间
2. 初始化对象
3. 将对象指向刚分配的内存空间
第 2. 步和第 3. 步可能会重排序,那么就有可能出现返回一个初始化未完成的对象。