ReentrantLock 加锁逻辑
2021-12-31 20:36:31 9 举报
登录查看完整内容
ReentrantLock 加锁逻辑
作者其他创作
大纲/内容
淘汰取消节点
为空
同步队列状态是否为0
当前线程需要阻塞:1. 前一个节点waitStatus = -1 (-1标识可唤醒) 继续执行2. 前一个节点waitStatus>0 (>0 标识这个节点已取消) 将已经取消的节点从同步队列中删除3. 其他情况CAS将前一个节点waitStatus 置为1
trytryAcquire尝试获取锁
是
否
条件成立
创建一个新节点1.CAS 将其设置为队头2. 队尾指向队头
exclusiveOwnerThread设置为当前线程
条件不成立
是否当前线程持有锁
构建一个互斥节点Node.EXCLUSIVE
获取当前线程&当前同步队列状态
acquire 获取锁
>1
上面第一步是否成立
CAS 成功
同步队列是否为空
CAS 失败
CAS 修改state 获取锁
公平锁
拿到头节点
加锁开始 ReentrantLock.lock()
公平锁?
CAS 设置当前AQS state 0 -> 1
不为0
默认非公平锁NonfairSync
非公平锁
将当前线程阻塞LockSupport.park(this);
为0,公平
不为空
将当前节点加入同步队列 1. prev指向队尾2.CAS将当前节点设置为队尾3. 之前的队尾指向当前节点
拿到的节点是否为头节点
FairSync公平锁
NonfairSync非公平锁
1. 当前线程是否可以直接获取锁(同步队列为空或当前线程为同步队列头)2.CAS 修改state 获取锁
锁重入:state + 1
加锁完成
拿到上一个节点(双向循环列表,只有一个节点时还指向自己)
(第二次进入由于上次进入执行了第三步,所以第一个判断成立)
new ReentrantLock(true / false);
为0,非公平
0 条评论
回复 删除
下一页