Semaphore-aqs之信号量
2021-12-09 15:56:19 5 举报
Semaphore-aqs之信号量
作者其他创作
大纲/内容
addWaiter(Node.SHARED)添加共享类型的节点
如果剩余超时时间大于 1 毫秒则阻塞线程LockSupport.parkNanos
tryAcquireShared通过 cas 尝试修改 state
tryAcquireSharedNanos
tryAcquireShared尝试获取共享锁
for(;;)
是
tryReleaseShared尝试释放共享锁
shouldParkAfterFailedAcquire设置前置节点状态为SIGNAL(-1)
否
公平锁会通过hasQueuedPredecessors先检查阻塞队列是否有有效节点
doReleaseShared如果还有剩余的可申请资源,且后续节点为共享节点,则继续唤醒下一个
doReleaseShared唤醒后面的线程
前置节点是否为头结点
获取成功
releaseShared是否共享锁
parkAndCheckInterrupt阻塞线程,等待唤醒
doAcquireSharedNanos超时获取共享锁
是否超时
doAcquireSharedInterruptibly获取共享锁
cancelAcquire设置waitStatus为CANCELLED(1)
shouldParkAfterFailedAcquire把前置节点设为SIGNAL(-1)
release
setHeadAndPropagate把当前节点设置为头结点,并传播
acquire
失败
0 条评论
回复 删除
下一页