日志文章

2019-12-27 aflfte2011

DCL单例模式

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的使用»