AQS之CyclicBarrie
2022-01-30 17:05:30 0 举报
CyclicBarrie
作者其他创作
大纲/内容
transferForSignal(Node node)
firstWaiter
waitStatus=0thread=thread1
lock.unlock()
唤醒thread0
prev
唤醒后续的节点
加锁
next
lastWaiter
thread2
唤醒thread1
waitStatus=-1thread=null
waitStatus=-2thread=thread0
parties=3
head
条件队列
同步队列转条件队列
LockSupport.park(this)
CAS尝试获取锁成功
nextWaiter
同步队列入队
tail
trip.signalAll()
frist
入队(条件队列), 阻塞
阻塞thread0
同步队列出队成功
waitStatus=0thread=null
阻塞thread1
真正用到的计数器,用于标记线程数
lock.lock()
LockSupport.unpark(s.thread)
waitStatus=-2thread=thread1
private void doSignalAll(Node first) { lastWaiter = firstWaiter = null; do { Node next = first.nextWaiter; first.nextWaiter = null; transferForSignal(first); first = next; } while (first != null); }
count=1
条件队列出队操纵
waitStatus=-1thread=thread0
thread0
条件等待对列: Condition
冲洗获取锁,执行完业务逻辑,再释放锁
入队成功
AQS: 同步等待队列 获取锁失败时, 入队 阻塞条件等待对列: Condition
count=0
总结:
thread1
释放锁
waitStatus=0thread=thread0
trip.await()
count=2
指定线程数,副本,用于重置
count=3
阻塞线程的唤醒,条件队列的出队
0 条评论
下一页