为什么这里也有synchronized (LazyDoubleCheckSingleton.class)但却说是兼顾了性能呢?
来源:8-3 单例设计模式-DoubleCheck双重检查实战及原理解析
乃好
2020-03-07
老师你好,这节代码中也是有synchronized (LazyDoubleCheckSingleton.class),同样是锁住了类,为什么说可以兼顾性能呢?
写回答
2回答
-
纪无涯
2020-03-16
我认为可以分成两个阶段来看,就可以很容易的看出两者的区别:
在单例对象未完成初始化之前,所有尝试获取单例对象的线程,都必须 等待并最终进入 synchronized 代码块,因此这一阶段,两种写法的性能消耗并没有区别
在单例对象已完成初始化之后
原始写法下,所有线程依然需要进入 synchronized 代码块 (但会在内层判空时检查到对象非空而马上退出)
双重检查下,所有线程不再需要进入 synchronized 代码块 (可以在外层判空时检查到对象非空而立即返回)
因此,可以看出两者的区别主要是在单例对象完成初始化之后,其他线程再次获取时是否还需要加锁 (加锁势必产生一定的性能消耗)
00 -
carrot4706421
2020-03-07
因为锁的粒度更细了,线程锁持有的时间会更短,所以说有一定的性能兼顾。不知道说的对不对,等老师再来补充回答一下。
00
相似问题