package com.com.hangzhou.singleton;
/**
* 单例模式 双重检锁模式
*/
public class SingletonDemo {
//volatile变量 保证可见性、禁止指令重排序 不保证原子性
private volatile SingletonDemo singletonDemo;
public SingletonDemo getSingletonDemo() {
if (singletonDemo == null) {
synchronized (SingletonDemo.class) {
if (singletonDemo == null) {
//三步执行:
// 1.为singletonDemo分配内存空间
// 2.初始化singletonDemo
// 3.将singletonDemo指向分配的内存地址
//但是由于JVM具有指令重排的特性,执行的顺序可能会1>3>2,
// 指令重排在单线程下不会有线程安全问题,
// 但在多线程环境下,会导致一个线程获得还没有初始化的实例
//例如线程T1执行1、3,此时线程T2调用getSingletonDemo()方法后发现singletonDemo不为空,
//因此返回singletonDemo,但此时singletonDemo 还未被实例化
//使用volatile关键字可以禁止指令重排序,保证在多线程环境下能正常运行
singletonDemo = new SingletonDemo();
}
}
}
return singletonDemo;
}
}