AQS之Semaphore
2022-01-29 22:09:48 0 举报
Semaphore流程
作者其他创作
大纲/内容
thread0
tail
LockSupport.park(this)
state=2
thread=thread3nextWaiter=Node.SHAREwaitStatus=0
prev
thread=nullnextWaiter=nullwaitStatus=-1
thread=thread3nextWaiter=Node.SHAREwaitStatus=-1
thread=nullnextWaiter=Node.SHAREwaitStatus=-1
state=0
直接阻塞thread4
thread=thread4nextWaiter=nullwaitStatus=0
next
唤醒阻塞的线程
出队
thread=nullnextWaiter=nullwaitStatus=0
尝试获取资源失败
head
thread1
获取资源,CAS成功
state=1
判断当前节点的下一个节点是否是共享模式,继续唤醒后续线程
没有获取到资源
入队成功
入队 阻塞
thread3
LockSupport.unpark(s.thread)
state=3
thread4
直接唤醒thread4
创建队列
没有资源 CAS成功
直接唤醒thread3
thread2
资源数
直接阻塞thread3
thread=nullnextWaiter=Node.SHAREwaitStatus=0
准备阻塞thread3
共享锁共享模式:Node.SHARE
释放资源,CAS成功
准备阻塞thread4
0 条评论
下一页