关于ReentrantLock的误区(看源码时发现的)

简介: 公平锁并不是绝对的公平,所谓的公平是针对clh队列内外的线程而言,当持有锁线程释放锁后,队列内部线程都会被唤醒去抢夺锁,我猜测(看了很久源码没找到答案,所以是猜测)AQS是根据队列位置来唤醒,所以头部节点对应线程获取锁概率更大

写在前面:


关于ReentrantLock这里不作过多解释,这篇博客两个目的,一是就我目前对ReentrantLock的理解,给大家指出一个很常见的误区;二来是探讨和求知,此篇博客观点纯是靠源码看来的,本人能力有限,对AQS作者想表达的意思理解可能不到位或者有偏差,希望有大佬看到后帮我指出,一定要指出,感谢


83cd25bd3c5c418cb7399e23695df0f5.png

正题开始


总所周知,ReentrantLock可以实现公平锁和非公平锁,我今天想说的是它的公平锁


老规矩,先抛问题:

1、怎么定义公平?

2、对谁公平?

误区:

先来举个栗子


五个线程ABCDE一起抢夺锁资源,假设A抢到了锁,BC没抢到但是先后进入了clh队列,DE没抢到也没进入clh队列,当A释放锁后,哪些线程会去抢夺锁资源?


想了很久,这个例子能很好地帮助理解公平锁


正常来讲,很多小伙伴会认为排在clh队列头部的线程B会拿到锁(我之前也是这么认为)


其实不然,在我看来已经入队的BC都有机会拿到锁,相对而言,B拿到锁的几率更大,先别喷我,等我上证据


下面是AQS源码注释,Lea大爷写的明明白白清清楚楚

b3ee931f8a1249bab21eb643565b3997.png

贴心的帮大家翻译:

71c4fcbbf151468695dafb71fedbddc4.png


所以,小结:


公平锁并不是绝对的公平,所谓的公平是针对clh队列内外的线程而言,当持有锁线程释放锁后,队列内部线程都会被唤醒去抢夺锁,我猜测(看了很久源码没找到答案,所以是猜测)AQS是根据队列位置来唤醒,所以头部节点对应线程获取锁概率更大


补充(重要):

后面又翻了下源码,发现是自己想多了,下个头节点确实不一定能拿到锁,但那是节点已取消或为null时才会发生,aqs解锁逻辑是依次唤醒后继节点,直到找到第一个没被取消且不为null的节点

7c0dc87faff444ea959055b3551c6cb2.png


以上


关于什么是公平锁,我已经疑惑了很久很久,这就是很多小伙伴让我写关于ReentrantLock底层原理分析文章我迟迟不写的原因,我自己还没搞懂呢;


最后


从文档、源码都找不到能很好支撑本人上述观点的依据(本来人也菜,找不到很正常),希望路过的大佬们能指出我的问题,并给出理由,感谢!


相关文章
|
5月前
|
存储 监控 安全
吃透synchronized实现原理
吃透synchronized实现原理
79 0
|
2月前
|
存储 Oracle 安全
揭秘Java并发核心:深入Hotspot源码腹地,彻底剖析Synchronized关键字的锁机制与实现奥秘!
【8月更文挑战第4天】在Java并发世界里,`Synchronized`如同导航明灯,确保多线程环境下的代码安全执行。它通过修饰方法或代码块实现独占访问。在Hotspot JVM中,`Synchronized`依靠对象监视器(Object Monitor)机制实现,利用对象头的Mark Word管理锁状态。
45 1
|
1月前
|
Java
JAVA并发编程ReentrantLock核心原理剖析
本文介绍了Java并发编程中ReentrantLock的重要性和优势,详细解析了其原理及源码实现。ReentrantLock作为一种可重入锁,弥补了synchronized的不足,如支持公平锁与非公平锁、响应中断等。文章通过源码分析,展示了ReentrantLock如何基于AQS实现公平锁和非公平锁,并解释了两者的具体实现过程。
|
5月前
|
Java
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
【5月更文挑战第6天】从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
28 1
|
4月前
|
安全 Java 开发者
一文弄懂synchronized
一文弄懂synchronized
66 0
|
5月前
|
Java 调度
10分钟从源码级别搞懂AQS(AbstractQueuedSynchronizer)
10分钟从源码级别搞懂AQS(AbstractQueuedSynchronizer)
|
5月前
|
安全 Java 调度
谈一谈synchronized和ReentrantLock
谈一谈synchronized和ReentrantLock
71 0
阅读完synchronized和ReentrantLock的源码后,我竟发现其完全相似
阅读完synchronized和ReentrantLock的源码后,我竟发现其完全相似
|
设计模式 安全 Java
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
|
安全 Java 大数据
深入探究 ReentrantLock 的应用和原理
深入探究 ReentrantLock 的应用和原理
164 0
深入探究 ReentrantLock 的应用和原理