AQS队列运行流程图
2022-07-25 16:03:25 0 举报
java AQS底层实现流程图
作者其他创作
大纲/内容
release(int arg)
head
加锁失败,阻塞
尝试加锁
解锁失败
waitStatus
tryRelease(arg)
解锁逻辑,不同锁实现不同,最重要的是这两步
next
CLH队列
unlock()
acquire(int arg)
thread
将state修改回来取消独占线setExclusiveOwnerThread(null);
Node h = head;if (h != null && h.waitStatus != 0) unparkSuccessor(h);return true;
lock()
pre
加锁成功,抢到锁
do { node.prev = pred = pred.prev;} while (pred.waitStatus > 0);pred.next = node;
return true
1.修改waitStatus为02.删除中断的节点3.唤醒队头节点
实现类
入队操作被唤醒就自选,没抢到再次阻塞
tryAcquire(arg)
state
shouldParkAfterFailedAcquire
调用aqs的加锁逻辑
加锁逻辑,不同锁实现不同,最重要的就是这两步
if (ws == Node.SIGNAL){ LockSupport.park(this);}
acquireQueued
return false加锁失败进入CLH等待队列插入到队尾
加锁
return false
waitStatus == Node.SIGNAL加锁失败,第二次进行阻塞
解锁成功
进行自旋
第一次正常进入,修改waitStatus
是队头再次去获取锁说明CLH是公平队列
尝试释放
释放锁
解锁
CAS修改state设置独占线程setExclusiveOwnerThread(current)
if (p == head && tryAcquire(arg)) { setHead(node); p.next = null; // help GC return interrupted; }
tail
0 条评论
下一页