ReentrantLock的lock流程
2021-05-15 10:45:08 10 举报
ReentrantLock的lock流程
作者其他创作
大纲/内容
返回false
false
pred.waitStatus > 0 ?
返回Node节点
parkAndCheckInterrupt()线程进入阻塞状态
ReentrantLock
true
返回false,表示线程没有获取到锁
尝试获取锁
公平锁
!= null 不为空
NonfairSync类的lock()
这里的参数 mode 为acquire方法里面传过来的一个null
pred.waitStatus == -1
通过 predecessor() 方法获取前一个节点
阻塞结束
非公平锁
tail
Node: n3thread = null;prev = null;
prev
== null
tryAcquire
next
hasQueuedPredecessors
getState == 0 ?
通过CAS尝试获取锁
tryAcquire尝试获取锁
addWaiter()添加等待队列
public void lock() { sync.lock();}
成功获取到锁设置锁持有线程为当前线程,并返回结束
判断 pred 尾节点 != null ?
AQS队列
整个方返回tue,表示获取锁成功
!= 0
判断前一个节点是否是头节点
设置重入锁计数器
调用setExclusiveOwnerThread设置当前线程为锁持有线程
head
判断想获取锁的线程 和 之前已经获取到锁的线程是不是同一个线程?
重入锁的实现原理
设置 pred.waitStatus = -1
== 0
shouldParkAfterFailedAcquire()
acquire(1)
Node: n2thread = null;prev = null;
再次循环判断
sync.lock()
FairSync类的 lock()
将当前线程封装到1个Node节点
lock
eqn()方法
获取锁
功能描述
整个方法返回false,表示获取锁失败
acquireQueued请求队列
Node: n1thread = null;prev = null;
定义 pred = tail 尾节点
Sync继承了AbstractQueuedSynchronizer
private final boolean parkAndCheckInterrupt() { LockSupport.park(this); return Thread.interrupted(); }
代表当前队列中存在已经正在等待的线程,那么将新的节点添加到队列中即可
锁的类型
整个tryAcqire返回false,表示获取锁失败
返回 true
收藏
0 条评论
回复 删除
下一页