CyclicBarrier流程分析
2021-11-23 11:12:33 0 举报
CyclicBarrier流程分析
作者其他创作
大纲/内容
unparkSuccessor
LockSupport.park
入同步队列阻塞
获取锁lock.lock()
trip.await()
firstWaiter
Thread-2
执行barrierCommand 回调线程业务逻辑
入队成功
unlock
dowait
nextWaiter
Thread-1
prev
条件队列转同步队列
count==0
trip.signalAll()
释放条件队列锁
唤醒
条件队列
node
thread2
创建CLH同步队列
释放lock锁
head
addConditionWaiter
!isOnSyncQueue(node)
thread1
子流程
next
Thread-0
同步流程链接
Thread0出同步队列唤醒
nextGeneration
条件队列转同步队列子流程
waitStatus=-2thread=thread-0
ConditionObject条件对象Node firstWaiter 条件队列,队首Node lastWaiter 条件队列,队尾font color=\"#ffb74d\
fullyRelease
同步CLH队列
入条件队列
doSignalAll
可以同时运行多个栅栏屏障,如果不是当前栅栏屏障则报错BrokenBarrierException
waitStatus=-2thread=thread-1
阻塞Thread1
lastWaiter
计数减一
transferForSignal
tail
1.先置空lastWaiter和firstWaiter2.取出firstwWaiter节点next节点3.置空first.nextWaiter节点4.transferForSignal(first)唤醒5.把next节点赋值为first节点
lock.unlock()
Thread-0,Thread-1转同步队列
thread0
enq(node)
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);创建一个栅栏屏障,需要等待3个线程cyclicBarrier.await();
Thread1出同步队列唤醒
阻塞Thread0
释放锁
0 条评论
回复 删除
下一页