AbstractQueuedSynchronizer(AQS)锁的释放
2022-05-02 15:44:34 0 举报
Java AbstractQueuedSynchronizer(AQS)锁的释放
作者其他创作
大纲/内容
CAS更新成功?
退出无限循环
yes
unparkSuccessor(h)唤醒后继节点
获取节点等待状态
锁成功释放?
tryReleaseShared(arg)抽象类,由子类实现
public final boolean releaseShared(int arg)释放共享锁
成功释放锁返回true
判断节点等待状态是否小于0?
no
CAS更新头节点等待状态为0
public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false; }
获取头节点
从尾节点开始由后向前遍历查询等待状态小于等于0的节点
CAS更新等待状态为0
CAS更新节点等待状态为Node.PROPAGATE
public final boolean releaseShared(int arg) { if (tryReleaseShared(arg)) { doReleaseShared(); return true; } return false; }
释放互斥锁
开始
释放锁失败返回false
tryRelease(arg)抽象类,由子类实现
头节点等待状态等于0?
头节点等待状态等于Node.SIGNAL?
结束
释放共享锁
获取当前节点的后继节点
判断后继节点是否为空且等待状态是否大于0
唤醒后继节点
唤醒该节点
doReleaseShared()
public final boolean release(int arg) 释放互斥锁
头节点不为空且头节点等待状态不为0?
获取头节点等待状态
当前处理节点等于头节点?(没有后续节点了)
头节点不为空且头节点不等于尾节点?
0 条评论
下一页