为什么这里也有synchronized (LazyDoubleCheckSingleton.class)但却说是兼顾了性能呢?

来源:8-3 单例设计模式-DoubleCheck双重检查实战及原理解析

乃好

2020-03-07

老师你好,这节代码中也是有synchronized (LazyDoubleCheckSingleton.class),同样是锁住了类,为什么说可以兼顾性能呢?

http://img.mukewang.com/szimg/5e6343710904c0ff09020279.jpg

写回答

2回答

纪无涯

2020-03-16

我认为可以分成两个阶段来看,就可以很容易的看出两者的区别:

  1. 在单例对象未完成初始化之前,所有尝试获取单例对象的线程,都必须 等待并最终进入 synchronized 代码块,因此这一阶段,两种写法的性能消耗并没有区别

  2. 在单例对象已完成初始化之后

  • 原始写法下,所有线程依然需要进入 synchronized 代码块 (但会在内层判空时检查到对象非空而马上退出)

  • 双重检查下,所有线程不再需要进入 synchronized 代码块 (可以在外层判空时检查到对象非空而立即返回)



因此,可以看出两者的区别主要是在单例对象完成初始化之后,其他线程再次获取时是否还需要加锁 (加锁势必产生一定的性能消耗)

0
0

carrot4706421

2020-03-07

因为锁的粒度更细了,线程锁持有的时间会更短,所以说有一定的性能兼顾。不知道说的对不对,等老师再来补充回答一下。

0
0

Java设计模式精讲-Debug方式+内存分析

系统学习设计原则,设计模式,锤炼编码内功,赢取高薪Offer

3430 学习 · 407 问题

查看课程