单例模式的双重检查成例的研究

本文探讨了双重检查锁定懒汉式单例模式的问题。通过详细分析案例代码,揭示了同步操作在变量初始化后的无效性,以及如何导致不必要的性能瓶颈。特别关注了多线程环境下变量初始化的顺序和同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:问题的引入

1:仔细看下面的代码你会发现,同步化实际上只有在变量第一次被赋值之前才有用,在 变量有了值之后,同步化实际上变成另一个没有必要的瓶颈,会造成额外的开销,因此设计成了双重检查成例(这是一个反面教材,因为双重检查成例在Java编译器里无法实现)


2:双重检查成例的懒汉式单例模式
1:案例代码

2:案例代分析
1:因为行程A和B是第一批调用者,因此,当它们进入此静态工厂方法时,checkSingleton变量是null,因此,线程A和B会同时或几乎同时到达位置1
2:假设线程A会首先到达位置2,并进入synchronized(this)到达位置3,这是,由于synchronized(this)的同步化限制,线程B无法到达位置3,而只能在位置2等候.
3:线程A指向 语句,使得 变量得到一个值,即对一个 对象的引用,线程B只能继续在位置2等候
4:线程A退出synchronized(this),返回checkSingleton对象,退出静态工厂方法.
5:线程B进入synchronized(this)块,达到位置3,4.由于checkSingleton变量已经不是null了,因此线程B退出synchronized(this),返回checkSingleton所引用的CheckSingleton对象(也就是线程A所创建的 对象),退出静态工厂方法.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值