Semaphore信号量共享流程分析
2021-11-18 17:51:44 0 举报
Semaphore信号量共享流程分析
作者其他创作
大纲/内容
thread=thread4nextWaiter=SHAREDwaitStatus=0
shouldParkAfterFailedAcquire
setHead
thread=thread3nextWaiter=SHAREDwaitStatus=0
thread=nullnextWaiter=nullwaitStatus=0
cas修改head节点状态为-1,表示下个节点可以被唤醒
releaseShared(1)
enq
入CLH队列流程
判断当前节点下个节点是否是共享模式
next
存在
把当前插入节点设置为tail
SHARED为共享模式
nonfairTryAcquireShared
唤醒当前节点的下个节点
释放锁
不存在cas创建双向队列
执行业务逻辑
doReleaseShared
阻塞
获取锁子流程
setHeadAndPropagate
判断资源是否足够tryAcquireShared(arg) < 0
唤醒子流程
自旋+cas
head不为null且不是tail节点
LockSupport.park
获取当前剩余资源减一自旋+cas
addWaiter(Node.SHARED)
获取资源是否成功
是
获取head节点
unparkSuccessor
prev
doAcquireSharedInterruptibly
返回成功
入队成功之后,有资源被释放,再次获取锁成功
否
释放锁子流程
小于0
compareAndSetTail
//创建3个信号量资源Semaphore windows = new Semaphore(3);//创建5个线程同时获取资源
thread=nullnextWaiter=nullwaitStatus=-1
thread=thread1nextWaiter=SHAREDwaitStatus=0
是否存在队列
LockSupport.unpark(s.thread)
thread=nullnextWaiter=SHAREDwaitStatus=0
0 条评论
下一页