AQS流程图
2024-11-15 17:51:46 0 举报
AQS加锁解锁流程图
作者其他创作
大纲/内容
创建一个当前线程的Node
acquireQueued
status-1
addWaiter(Node mode)
将前驱节点设置为SIGNAL
把自己设置为head并占有锁
前驱取消了排队继续向前找
队列为空
c==0
CANCELLED
插入失败(其他线程在CAS)
获取锁失败
current == getExclusiveOwnerThread()
unlock()
LockSupport.park
当前线程就是自己可重入锁
当前无线程使用锁自旋获取锁成功
acquire()
尝试CAS插入队尾
线程T1
LockSupport.unpark
initializeSyncQueue
如果前驱是头节点
tryAcquire(arg)
前驱不是头节点
尝试释放锁
return true
插入成功
没有获取到锁
其他
release
tryRelease(arg)
再次尝试获取锁
SIGNAL
挂起当前线程
插入成功,跳出循环
parkAndCheckInterrupt()
尝试获取锁
lock()
获取锁成功
当status为0时清空线程
返回Node
CAS插入头节点
shouldParkAfterFailedAcquire
唤醒头节点
New Node()放在队头
再次进入循环
队列不为空
return false
收藏
0 条评论
下一页