aqs 核心逻辑 jdk17
2024-04-06 20:48:26 1 举报
aqs 核心逻辑 jdk17
作者其他创作
大纲/内容
是
当前节点是否为 null
AbstractQueuedSynchronizer#tryAcquireShared
否
把当前节点设置为 head
AbstractQueuedSynchronizer#acquire
spins 翻倍
如果是共享锁
是否获取到锁
创建节点SharedNodeExclusiveNode
jdk 17版本中,如果可能先尝试获取锁,不然就会来到这
设置节点状态为 WAITING
前置节点是否为null
Thread.onSpinWait();让出cpu,进行下一次循环
是否为共享模式
LockSupport#park阻塞,等待 unpark
头结点获取锁自旋的次数,每一次唤醒自旋的次数就翻倍
AbstractQueuedSynchronizer#tryAcquire
当前是第一个节点但是 spins 大于 0
AbstractQueuedSynchronizer#casTail通过cas 尝试入队
当前节点的状态为 0
等待其他操作唤醒,醒来后继续循环尝试获取锁
AbstractQueuedSynchronizer#signalNextIfShared如果下一个节点是共享锁就唤醒
当前节点是第一个,并且前置节点为null
0 条评论
下一页