package com.aflfte.others;
/**
* DCL单例模式
* 懒汉式套路基础上加入并发控制:保证在多线程环境下对外只存在一个对象
* 1、构造器私有化-->避免外部new构造器
* 2、提供私有的静态属性-->存储对象的地址
* 3、提供公共的静态方法-->获取属性
*
* double-checked locking
* @author jinhao
*
*/
public class DoubleCheckedLocking {
//提供私有的静态属性
private static volatile DoubleCheckedLocking instance;//加上volatile避免CPU进行指令重排
//没有volatile其它线程有可能访问到一个没有初始化的对象。
//提供私有构造器
private DoubleCheckedLocking() {
}
//提供公共的静态方法->获取属性
public static DoubleCheckedLocking getInstance() {
if(instance!=null) {//再次检测 避免不必要的同步,已经存在的对象
return instance;
}
synchronized (DoubleCheckedLocking.class) {
if(instance==null) {
instance=new DoubleCheckedLocking();
//新建对象三步曲:1、开辟空间,2、初始化对象信息,3、返回对象的地址给引用
}
}
return instance;
}
public static void main(String[] args) {
new Thread(()->{
System.out.println(DoubleCheckedLocking.getInstance());
}) .start();
System.out.println(DoubleCheckedLocking.getInstance());
}
}
« ThreadLocal的使用(查看线程存储空间)
|
Volatile的使用»
|