双重检测机制单例代码:
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) { 1
synchronized (Singleton.class) {
if (singleton == null) { 2
singleton = new Singleton(); 3
}
}
}
return singleton;
}
}
了解这个机制之前我们要知道一个定义指令重排:简单理解就是,虚拟机或者CPU会在不影响代码执行结果的情况下,改变代码的执行顺序来优化代码(单线程或正常同步情况下)
singleton = new Singleton()创建对象的过程不是原子性的分为三步:
①.分配对象的内存空间
②.初始化对象
③.将实例指向刚分配的内存地址
但在实际的情况因为指令重排 执行的顺序可能不是①》②》③,而是①