AQS (abstract Queue Synchronizer)
2021-01-14 15:07:20 1 举报
AQS运行流程图
作者其他创作
大纲/内容
执行 park 逻辑
false 再次提交循环
false
true
node: n3
返回node
false执行上图2步骤
aqs 队列(链表)
prev
public void lock() { sync.lock();}sync 继承了AbstractQueuedSynchronizer
head
thread=t2prev=n1next=n3
非公平锁
thread=t2prev=n1next=null
node: n1
next
tail
CAS获取锁
Nodel:n2
3
addWaiter(Node.EXCLUSIVE)
thread=t2prev=n2next=null
enq方法
设置 pred.waitStatus=-1
整个AQS 的核心和难点之一注意这里使用 for(;;) 首先判断 node 节点的前辈节点font color=\"#ff0000\
p == head? 表示查询 node 是不是第一个排队的
thread=nullprev=nullnext=n2
NonfairSync#lock
true 执行上图1的步骤
tryAcquire(arg)
FairSync#lock
哨兵节点
parkAndCheckInterrupt()线程进入阻塞状态
AQS队列(链表)
abstract void lock()
再次循环判断
执行排队逻辑
阻塞结束
lock
ReetrantLock
Nodel:n1
pred != null
公平锁
pred.waitStatus >0
acquire(1)
返回 true
pred.waitStatus == Node.SIGNAL
node: n2
sync.lock()
shouldParkAfterFailedAcquire 方法详解
返回 false
acquireQueued 方法详解
0 条评论
回复 删除
下一页