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

举报
负债程序猿 发表于 2022/02/19 00:27:22 2022/02/19
【摘要】 写在前面: 关于ReentrantLock这里不作过多解释,这篇博客两个目的,一是就我目前对ReentrantLock的理解,给大家指出一个很常见的误区;二来是探讨和求知,此篇博客观点纯是靠源码看来的,...

写在前面:

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

lea大爷镇楼

正题开始

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

老规矩,先抛问题:
1、怎么定义公平?
2、对谁公平?

误区:
先来举个栗子

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

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

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

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

下面是AQS源码注释,Lea大爷写的明明白白清清楚楚
在这里插入图片描述
贴心的帮大家翻译:
在这里插入图片描述

所以,小结:

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



补充(重要):
后面又翻了下源码,发现是自己想多了,下个头节点确实不一定能拿到锁,但那是节点已取消或为null时才会发生,aqs解锁逻辑是依次唤醒后继节点,直到找到第一个没被取消且不为null的节点
在这里插入图片描述



以上


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

最后

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

文章来源: huangjie.blog.csdn.net,作者:负债程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:huangjie.blog.csdn.net/article/details/120936451

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。