CyclicBarrier源码分析
2022-06-13 12:33:01 0 举报
通俗易懂的CyclicBarrier源码分析,AQS,AbstractQueuedSynchronizer
作者其他创作
大纲/内容
firstWaiter
CyclicBarrier cb=new CyclicBarrier(3)
lock.unlock()
next
唤醒条件队列
prev
条件队列
2.解锁开始唤醒同步线程
同步队列
但是thread0被阻塞,这里不解锁
command.run()
lastWaiter
waitStatus=-1thread =thread1
循环
dowait
此时因为条件队列未转同步队列,同步列队为空,所以不会唤醒
waitStatus=-1thread =thread0
3.thread0被唤醒
transferForSignal(first);
执行下一个屏障生成,重置count = parties
waitStatus=-1thread = null
nextWaiter
waitStatus=-2thread=thread0
--count;
state=0
5.唤醒thread1
获取锁lock.lock()
尝试释放锁
thread1
trip.await()
do-while第一个节点开始并逐渐删除节点
enq(node)
释放锁
addConditionWaiter()
tail
入队
是否在同步队列
fullyRelease(node)
转移到同步队列
被阻塞,暂不执行
--count
自旋
阻塞thread0
count==0
入队,阻塞
!isOnSyncQueue(node)
条件队列转同步队列示意图
head
计数减一
nextGeneration()
trip.signalAll()
waitStatus=-2thread=thread1
unparkSuccessor(h)
转到同步队列
执行barrierCommand回调线程逻辑
4.thread0释放锁
条件队列节点signalAll转到同步队列
LockSupport.park(this)
state=2
state=3
doSignalAll(first)
finallylock.unlock()
阻塞thread1
node0
1.转移到同步队列完成后,finally解锁
构造方法
release()解锁如果此时同步队列不空,唤醒同步队列线程
thread2
thread0
但是thread1被阻塞,这里不解锁
条件队列转同步队列
state=1
6.thread1释放锁,此时同步队列空,不再唤醒下一个节点
蓝色线条为解锁,可先不看,以免混乱
0 条评论
下一页