Semaphore
2022-03-25 16:37:47 6 举报
信号量底层流转实现
作者其他创作
大纲/内容
线程获取失败会创建一个队列进行入队操作
Theand1
Theand0
出队
Thread3出队变成头节点
thead=nullnextWaiter=Node.SHAREDwaitStatus=0
next
prev
LockSupport.unpark(this)
准备阻塞Thread4
thead=nullnextWaiter=nullwaitStatus=-1
thead=nullnextWaiter=nullwaitStatus=0
尝试获取资源失败
双向链表
thead=Thead4nextWaiter=Node.SHAREDwaitStatus=0
获取资源CAS成功
LockSupport.park(this)
state=0
state=2
入队 阻塞
创建队列
Theand4
阻塞Thread4
taill尾部
入队,阻塞
thead=Thead3nextWaiter=Node.SHAREDwaitStatus=0
准备阻塞Thread3
head:头对列
Thread3
判断是否是共享模式,继续唤醒后续线程Thread4
Theand3
state=1
获取资源,CAS成功
获取资源失败
thead=Thead3nextWaiter=Node.SHAREDwaitStatus=-1
共享锁:nextWaiter=Node.SHARED
Theand2
唤醒阻塞的线程
创建阻塞队列
thead=nullnextWaiter=Node.SHAREDwaitStatus=-1
唤醒前置置为-1
阻塞Thread3
释放资源,cas成功
资源数3:Semaphore windows = new Semaphore(3);state=还剩下多少进入的线程(3)
thead=Thead4nextWaiter=Node.SHAREDwaitStatus=-1
唤醒Thread4
Thread4唤醒
唤醒Thread3
0 条评论
下一页