DCL锁双重检查;

本文深入探讨了在多线程环境下,如何使用Double Check Locking(DCL)解决单例模式中的并发问题。DCL通过两次检查和加锁确保线程安全,避免了不必要的锁竞争。同时,文章提到了CPU指令重排可能导致的线程安全问题,强调了保证数据最终一致性的重要性。内容涵盖了Java内存模型、单例模式实现、线程同步和程序优化。

学习来源于:B站马士兵视频:《计算机底层原理

DCL:Double check lock。

其本质是为了解决多线程中语句执行不确定性

你也不知道当前其他线程进行到哪里,哪里都有可能。

比如在单例模式中,需要判断单例对象是否已经存在,if如果单例存在:则返回单例。否则else就去new一个单例。

这样做有一个问题:当涉及到多线程时,可能有多个线程同时来判断单例是否存在,此时,有两个甚至多个线程同时判断为不存在,则多个线程都会去创建单例。这样还是很多对象。

如何避免,首先考虑加锁,即判断单例是否存在的这个操作,应该加到锁中,判断加锁这个操作,本身也要加锁。

即我们:

S1:先判断单例是否存在,(第一次check

S2:如果不存在,那我们就要加锁,准备执行创建对象这个过程。

S3:加锁完成后。注意:此时有可能有多个线程,同时判断check发现单例不存在,那么这个锁一旦解开,其他线程还是会进入锁区重新创建对象,所以,需要在锁区,进行第二次check判断单例对象是否存在。这个在锁定代码区中先进性的二次判断单例是否存在,就叫做:DCL。

S4:在锁区内部,第二次check之后,判断单例是否已经存在,如果存在,那么就直接返回,否则创建。

总结:

就是Check-Lock-Check

<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值