1.DCL单例模式就是检查两次判断是否为空
static保证只加载一次,
public class SingletonExample5 {
private SingletonExample5(){}
//单例对象 volatile + 双重检测机制来禁止指令重排
private volatile static SingletonExample5 instance = null;
public static SingletonExample5 getInstance(){
if (instance == null){
synchronized (SingletonExample5.class){
if(instance == null){
instance = new SingletonExample5();
}
}
}
return instance;
}
}
成员变量 new object
1分配空间申请内存 赋默认值
2然后调用构造方法 赋初始值
3内存地址赋予变量
如果调用顺序是1,3,2 这就是指令重排,把分配空间指向变量,但是还没有调用调用构造方法,如果这个时候调用这个方法,instance 是不为null的,但是对象.成员变量是没有初始化的。使用volicate关键字会禁止指令重排,避免这种错误