AQS流程图
2023-03-29 16:45:38 8 举报
AQS流程图,免费使用,若有误,请联系我指出,谢谢大家。
作者其他创作
大纲/内容
创建一个当前线程的Node
队列空了
addWaiter(Node mode)
将前驱节点设置为-1因为你需要-1的节点来唤醒自己
前驱节点正常线程挂起
前驱取消了排队继续向前找
队列为空
c==0
pred.waitStatus0
插入失败(其他线程在CAS)
current == getExclusiveOwnerThread()
当前线程就是自己可重入锁
当前无线程使用锁自旋获取锁成功
acquire()
尝试CAS插入队尾
线程T1
enq(node)
如果前驱是队头或者尝试获取锁成功了
tryAcquire(arg)
前驱不是队头或者没有抢赢其他线程
return true
插入成功
这是一个循环,所以总能成功的
没有获取到锁
把自己设置为head并占有锁
pred.waitStatus==-1
队列不空
挂起当前线程等待被唤醒结束
插入成功,跳出循环
parkAndCheckInterrupt()
尝试获取锁
lock()
返回Node
New Node()放在队头
再次进入循环
队列不为空
return false
收藏
0 条评论
下一页