DCL(Double Check Lock双端检锁机制)单例模式:适用于多线程高并发场景
/**
* DCL(Double Check Lock双端检锁机制)单例模式:适用于多线程高并发场景
*/
public class SingletonPattern {
//DCL机制不一定线程安全,原因是有指令重排序的存在,加入volatile可以禁止指令重排,
//原因在于某一个线程执行到第一次检测,读取到singletonPattern不为null时,singletonPattern的引用对象可能没有完成初始化。
//创建对象分三步,1、分配对象内存空间 2、初始化对象 3、设置singletonPattern指向刚分配的内存地址,此时singletonPattern != null
//步骤2和步骤3不存在数据依赖关系,而且五轮重排前还是重排后程序的执行结果在单线程中并没有改变,因此这种重排优化是允许的。
private volatile static SingletonPattern singletonPattern = null;
private SingletonPattern(){
//对象创建成功后打印,如单例模式,应只打印一次
System.out.println(Thread.currentThread().getName() + " : " + "SingletonPattern!");
}
private static SingletonPattern getSingletonPattern (){
if(singletonPattern == null){
//如多个线程同时进入,那么在进行一次加锁验证,保证只创建一个对象
synchronized (SingletonPattern.class){
if(singletonPattern == null){
singletonPattern = new SingletonPattern();
}
}
}
//如果未加volatile导致指令重排,其他线程可能会直接返回未初始化的对象。
return singletonPattern;
}
public static void main(String[] args) {
for(int i = 0; i < 100 ; i++){
new Thread(() -> {
getSingletonPattern();
},String.valueOf(i)).start();
}
}
}
网友评论