懒汉式的单例加入synchronized 虽然保证线程安全但效率低
就有了双重检查锁DCL(double checked locking)机制实现单例提升效率
双重检查锁就是在synchronized 前后加入if判断
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
java中创建一个对象分解成三行伪代码
//1:分配对象的内存空间
memory = allocate();
//2:初始化对象
ctorInstance(memory);
//3:设置instance指向刚分配的内存地址
instance = memory;
JMM中有提到计算机为了提升运行效率做到最优会对编译器或处理器的指令进行重排序
以上 2、3中顺序有可能打乱情况下 线程A设置好对应的实例对象引用地址后 线程B在IF后发现实例对象不为null 获得一个未初始化的对象则无法获得锁了 在多线程下并不安全。
怎样让他变的安全呢?当然就是volatile的内存屏障来防止重排序