ReentryLock的实现细节

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方法在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值