背景知识
什么是DCL
Double Check Lock的缩写,双重检测锁。
懒加载单例模式
public class Singleton {
private static volatile Singleton singleton;
private long a;
private Singleton() {
this.a = 100L;
}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
// DCL : Double Check Lock 双重检查锁, 防止获取到锁时,已经有线程将其实例化了。
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
public long getA() {
return a;
}
}
对象的创建过程
1、申请内存空间
2、调用构造方法进行初始化
3、引用赋值
其中2和3可能存在指令重优化。
问题解答
DCL单例是采用懒加载单例模式来实现的,其中对象的创建过程不是原子性操作,可能会存在指令重排优化,从而导致所引用的实例可能并没有完全实例化,而volatile可以禁止指令重排优化。
参考
https://blog.csdn.net/qq_26817225/article/details/107215878