2025年ReentryLock的实现细节

ReentryLock的实现细节1 ReentryLock 实现了 Lock 接口 并且构造方法中初始化内部同步器 根据 Syn 的类别不同加锁步骤也有些不一样 1 非公平锁 如下 直接尝试获取锁 获取成功则把当前线程设为锁的拥有者 否则进行 acquire 2 公平锁 3acquire 方法 tryAcquire 方法也很简单 就是判断当前同步器是否可用

大家好,我是讯享网,很高兴认识大家。

1 ReentryLock实现了Lock接口,并且构造方法中初始化内部同步器
在这里插入图片描述
讯享网
根据Syn的类别不同加锁步骤也有些不一样,
1非公平锁,如下
在这里插入图片描述
直接尝试获取锁,获取成功则把当前线程设为锁的拥有者,否则进行acquire
2公平锁
在这里插入图片描述
3acquire方法
在这里插入图片描述在这里插入图片描述
tryAcquire方法也很简单,就是判断当前同步器是否可用,
1如果是非公平锁,则直接进行尝试获取锁
2如果是公平锁要确保,当前等待队列没有线程,则在进行获取
3获取锁失败,这判断当前显示是否已经拥有锁,如果已经拥有,则增加
4否则返回false;

addWiter()方法

在这里插入图片描述
该方法简单易懂,直接在用CAS在队尾添加元素,如果添加失败,则调用enq方法,循环CAS添加到队尾 PS(这个队列是懒加载的,即当使用时才会对head和tail进行初始化,所以要加if判断)

acquireQueued()方法
在这里插入图片描述
1本方法也很直接,先检查当前线程是否是头结点,如果是则尝试获取,获取成功,则返回失败
2进入should 方法改变pre结点的状态,为了多自选一次,
3第二次自选还是失败的话就会进入阻塞,

unlock方法,调用release方法.
在这里插入图片描述
在这里插入图片描述
方法就是先尝试把当前线程的计数器减1,然后返回
如果state==0,则表明当前锁已经被释放,尝试唤醒队列中的第一个有效线程.

Condition内部类
在这里插入图片描述
内部也是一样维护着一个双向链表实现的队列
在这里插入图片描述
向等待队列中添加一个元素
在这里插入图片描述
流程很简单,就是把等待队列的元素断开,并放到同步器队列当中去,竞争锁。
在这里插入图片描述
await方法在这里插入图片描述

小讯
上一篇 2025-01-18 19:23
下一篇 2025-03-09 16:09

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37300.html