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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 