ReentrantLocal流程图
2022-05-19 11:27:19 3 举报
1
作者其他创作
大纲/内容
0
cancelAcquire取消获取资源
state+1并设置setState返回true
自旋获取节点的前置节点node.predecessor()
判断前置节点状态
lock()
currentThread=getExclusiveThread(当前线程=独占线程)
ReentrantLock NonFairSync(非公平锁)
需要唤醒返回true
Node pred=tail(tail节点设为前置节点)
addWriter(Exclusive)
NonFairSync.tryAcquire()
tail==null(证明是一个空队列,需要cas()添加头节点)
!tryAcquire()&&acquireQueued()
true代表当前线程获取到锁,false未获取到
setExclusiveOwnerThread(将当前线程设为独占锁线程)
将node设为pred的next节点,并返回node
CAS设置当前线程为独占线程,并返回true
node.prev=pred
CAS设置pred节点
未获取到锁且添加队列失败
true
pred!=null
false
cas设置头节点,tail=head
将前置节点状态设为signal
说明前置节点已被取消,循环向前找未被取消的节点,并设置pred.next=node
enq自旋加入队列节点
CAS()比较状态,锁是否被占用
将节点设置成头节点,并且.next设为null,打断循环
SIGNAL
前置节点=头节点head&&NonFairSync.tryAcquire()
是
acquire()获取锁
否
getState()获取当前锁状态
收藏
收藏
0 条评论
回复 删除
下一页