ReentrantLock原理分析图(加锁)
2020-03-28 20:56:15 0 举报
重入锁ReentrantLock的实现原理流程图(加锁部分)
作者其他创作
大纲/内容
更新成功/失败
判断锁状态
end
state=0
获取锁成功/失败
Y:线程获得了锁,继续执行
lock
首先再尝试获取一次锁
N:将当前线程加入到队列中
AbstractQueuedSynchronizer
tryAcquire
addWaiter
调用lock加锁
N:线程需要排队,判断一下线程排队时是否需要挂起
acquire
判断线程的等待状态
compareAndSetState
shouldParkAfterFailedAcquire
Y:将当前节点Node更新为head,结束加锁
N
waitStatus=-1(SIGNAL)线程挂起,等待唤醒
waiting
Y:锁被释放再次尝试获取
waitStatus0(CANCLE)将pre节点从同步队列中断开,选取下一个pre再次循环
start
Thread
NonfairSync
N:不是head说明需要排队
acquireQueued
既不等于-1又不大于0,就把pre的waitStatus改成0,选取下一个pre再次循环
当前线程的pre节点是否为head
cas更新锁状态
Y:再次尝试获取锁
waitStatus
ReentrantLock
0 条评论
下一页