ReentrantLock互斥和重入锁实现原理

ReentrantLock的非公平锁允许线程尝试直接获取锁,失败则进入等待队列,释放锁时唤醒next节点。公平锁则在获取锁前检查等待队列,确保按顺序获取。两种锁在尝试获取和释放锁的策略上有所不同,影响线程的等待和竞争行为。

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

Reentrant基础的内容就不再赘述,大家自行搜素下即可。

非公平锁

ReetrantLock中的非公平锁语义是什么?

涉及到锁竞争,就涉及如何竞争锁,以及竞争失败的处理,和锁释放后如何唤醒那些竞争失败的线程。
ReentrantLock的非公平锁实现中,在线程尝试获取锁时,会先尝试通过CAS获取锁如果失败则会将当前线程加入等待队列尾部,并且根据条件将当前线程挂起。
在释放锁时,会将当前节点的next节点置为head节点,并唤醒next节点的线程。被唤醒线程会通过自旋尝试获取锁,但这里要注意的是,可能会出现与其他刚刚进来的线程竞争的情况,导致当前线程获取锁失败。 因此这里非公平锁的语义就是最先进入的请求无法保障能在锁资源释放后肯定能获取到锁,但等待队列中的线程还是能够保障先后顺序的。

获取锁的原理

● 获取锁失败首先进行自旋;
● 当达到指定条件后进入WATING状态;
● 当等待队列中的前一个线程释放锁之后,当前线程被唤醒,尝试获取锁,有可能会获取锁失败,被新进来的线程抢占;
● 获取锁失败就继续自旋,一直到获取锁成功。
● 获取锁时如果发现持有锁的是当前线程,会进行锁计数加一操作,这就是重入的逻辑。
ReentrantLock原理.png

释放锁的实现原理(公平、非公平锁相同)

image.png

公平锁

知道了非公平锁的语义是无法确保等待时间最常的头节点的线程立即获取到锁,那公平锁的语义就是保证线程获取锁的先后顺序。

与非公平锁实现的差别

公平锁与非公平锁的区别主要在tryAcquire获取锁的实现中,非公平锁无论是否有等待的线程都尝试去获取锁,而公平锁每次都要判断队列中是否有线程等待,如果有线程的话就不获取锁。
详细的流程如下:
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹氿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值