学习来源于:B站马士兵视频:《计算机底层原理》
DCL:Double check lock。
其本质是为了解决多线程中语句执行不确定性。
你也不知道当前其他线程进行到哪里,哪里都有可能。
比如在单例模式中,需要判断单例对象是否已经存在,if如果单例存在:则返回单例。否则else就去new一个单例。
这样做有一个问题:当涉及到多线程时,可能有多个线程同时来判断单例是否存在,此时,有两个甚至多个线程同时判断为不存在,则多个线程都会去创建单例。这样还是很多对象。
如何避免,首先考虑加锁,即判断单例是否存在的这个操作,应该加到锁中,判断加锁这个操作,本身也要加锁。
即我们:
S1:先判断单例是否存在,(第一次check)
S2:如果不存在,那我们就要加锁,准备执行创建对象这个过程。
S3:加锁完成后。注意:此时有可能有多个线程,同时判断check发现单例不存在,那么这个锁一旦解开,其他线程还是会进入锁区重新创建对象,所以,需要在锁区,进行第二次check判断单例对象是否存在。这个在锁定代码区中先进性的二次判断单例是否存在,就叫做:DCL。
S4:在锁区内部,第二次check之后,判断单例是否已经存在,如果存在,那么就直接返回,否则创建。
总结:
就是Check-Lock-Check。
<
本文深入探讨了在多线程环境下,如何使用Double Check Locking(DCL)解决单例模式中的并发问题。DCL通过两次检查和加锁确保线程安全,避免了不必要的锁竞争。同时,文章提到了CPU指令重排可能导致的线程安全问题,强调了保证数据最终一致性的重要性。内容涵盖了Java内存模型、单例模式实现、线程同步和程序优化。
最低0.47元/天 解锁文章
711

被折叠的 条评论
为什么被折叠?



