基于双重检查的单例模式
public class Singleton {
// 通过volatile关键字来确保安全,必需添加volatile
//来防止指令重排序
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){ //第一步
synchronized (Singleton.class){ //第二步
if(singleton == null){. // 第三步
singleton = new Singleton(); //4第四步
}
}
}
return singleton;
}
}
程序要点解析;
注意点:
- volatile必需使用
- 构造方法必需设置为私有
- 必需使用双重检查锁定
先回顾一下对象的创建过程,实例化一个对象分为三步
|
但是由于重排序的原因,步骤 2、3 可能会发生重排序,其过程如下:
|
导致的问题是,当执行第一步对象null判断时,有线程执行到第4步,初始化对象,由于指令重排序的问题,先给singleton设置了引用,导致第一步判断对象非null,导致返回的对象是未初始化问题的