目录

昏黄のすみ

灰色的雾蒙着日出前的眼睛

DCL单例模式(懒汉)

public class Single{
	private Single(){}
	private volatile static Single single;
	public Single getSingle(){
		if(single==null){
			synchronized(Single.class){
				if(single ==null){
					single == new Single();
				}
			}
		}
	}
}
  • 为什么要使用两个if判断呢?
    • 因为如果有许多线程在抢一个锁 , 那么当一个线程抢到之后赋了值 ,其它线程还要继续抢 , 这样就会极大的浪费性能 , 所以只要有一个线程抢到锁后完成了赋值 , 那么在其他线程在第一个if的时候就隔绝了抢锁的一个过程
  • 但是这样会有极小极小的可能性出现一个BUG
    • 这个BUG就是CPU的乱序执行 , 乱序执行就是两个(几个都行)指令/语句之间没有任何联系 , 那么就可能第二条指令/语句执行在第一条前面
    • 这样的话在new对象时的汇编指令就有可能发生乱序 , 可能在创建对象的时候内部变量全是初始值 , 哪怕你赋了值
    • 所以就需要在对象前面加上一个关键字volatile , 这个关键字可以防止乱序执行

标题:DCL单例模式(懒汉)
作者:hunhuang
地址:http://zhanf.top/articles/2020/10/14/1602682912033.html