ReentryLock的实现细节

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

addWiter()方法

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

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

unlock方法,调用release方法.
ReentryLock的实现细节_第8张图片
ReentryLock的实现细节_第9张图片
方法就是先尝试把当前线程的计数器减1,然后返回
如果state==0,则表明当前锁已经被释放,尝试唤醒队列中的第一个有效线程.

Condition内部类
ReentryLock的实现细节_第10张图片
内部也是一样维护着一个双向链表实现的队列
ReentryLock的实现细节_第11张图片
向等待队列中添加一个元素
ReentryLock的实现细节_第12张图片
流程很简单,就是把等待队列的元素断开,并放到同步器队列当中去,竞争锁。
ReentryLock的实现细节_第13张图片
await方法ReentryLock的实现细节_第14张图片

你可能感兴趣的:(java)