DoubleCheckLocking.java
/**
* DCL单例模式:在懒汉式套路基础上加入并发控制,在多线程环境下,对外存在一个对象
* 1、提供私有的静态属性--->存储对象地址
* 2、构造器私有化--->避免外部new构造器
* 3、提供公共的静态方法--->获取属性
*/
public class DoubleCheckLocking {
//1、提供私有的静态属性--->存储对象地址
private static volatile DoubleCheckLocking instance;
//2、构造器私有化--->避免外部new构造器
private DoubleCheckLocking(){
}
//3、提供公共的静态方法--->获取属性
public static DoubleCheckLocking getInstance(){
//避免不必要的同步(防止每个线程都要synchronized一次)
if(null != instance){
return instance;
}
//防止线程创建多个对象
synchronized(DoubleCheckLocking.class) {
if (null == instance) {
instance = new DoubleCheckLocking();
//new对象时出做出这三步:1、开辟空间 2、初始化对象信息 3、返回对象的地址给引用
//但是如果A线程在new对象的时候,B线程就开始拿对象的地址,就可能拿到空地址(可能会发生指令重排,给私有的静态属性加个volatile)
}
}
return instance;
}
public static void main(String[] args) {
Thread thread = new Thread(()->{
System.out.println(DoubleCheckLocking.getInstance());
});
thread.start();
System.out.println(DoubleCheckLocking.getInstance());
}
}
运行结果:
DoubleCheckLocking@6d03e736
DoubleCheckLocking@6d03e736