使用场景:

多个线程相互等待,直到都满足条件之后,才能执行后续的操作。CyclicBarrier描述的是各个线程之间相互等待的关系。

使用步骤:

  1. 正常实例化:CyclicBarrier sCyclicBarrier=new CyclicBarrier(3);
  2. 带runnable的实例化,打破屏障时,优先执行Runnable:CyclicBarrier sCyclicBarrier=new CyclicBarrier(3,new Runnable(){//todo});
  3. await线程:sCyclicBarrier.await();
  4. 当wait线程数量为,count值时。唤醒所有等待线程。

原理:这里直接用源码解释(后续补充)

  1. 锁用的是ReentrantLock重入锁。ReentrantLock lock = new ReentrantLock()
  2. 获取该锁的condition实例。Condition trip = lock.newCondition()
  3. wait线程,用的是Condition.await
  4. signal线程,用的是Condition.signalAll
  5. 两个构造函数,初始化parties值,count值,以及Runnable(唤醒时优先执行runnable)
  6. count值是用来计算线程数的。每有一个线程执行了await方法,--count。直到count==0
  7. await方法,包含了是否超时,以及超时时间
  8. dowait是线程wait的主要逻辑代码。当count==0时执行唤醒操作。不为0时,进入for循环,执行Condition.await。
  9. dowait中的for循环是为了超时操作的逻辑。
  10. 正常跳出for循环是通过dowait方法中的(nextGeneration()重新实例化了gennaration)
  11. breakBarrier() 打破屏障,唤醒所有wait线程
  12. nextGeneration() 更新状态,唤醒所有wait线程
  13. reset()重置状态。里面调用了breakBarrier()和nextGeneration()

最新文章

  1. 利用npoi导出Excel
  2. Linux文件标示
  3. Log4cplus使用
  4. 创建线程方式-GCD
  5. PHP防止页面刷新、重复提交数据
  6. CSS user-select属性拾遗
  7. mysql----用户root被删除或忘记root密码的解决方案
  8. 联想K82------智能电视行业的野蛮入侵者
  9. jquery 重复事件
  10. MAC系统操作指令汇总
  11. Lucene的配置及创建索引全文检索
  12. break退出循环分析
  13. How to find SPRO path by t-code name
  14. json和数组的区别
  15. Python使用filetype精确判断文件类型 (文件类型获取)
  16. Spring读取配置文件 @Value
  17. Android -- DiskLruCache
  18. spine-unity3D 学习笔记
  19. 内置锁(一)synchronized 介绍与用法
  20. nginx简介和配置gd

热门文章

  1. 查看权限详情 将部门大类单据整合,将子类单据id去重合并
  2. JAVA_JNI字段描述符“([Ljava/lang/String;)V”(Android)
  3. Java学习日报7.17
  4. linux零基础之--使用putty配置
  5. flume将数据写入各个组件
  6. OpenTelemetry - 云原生下可观测性的新标准
  7. 【MyBatis】MyBatis 延迟加载策略
  8. 号称能将STW干掉1ms的Java垃圾收集器ZGC到底是个什么东西?
  9. Vue基础语法与指令
  10. 十七:SQL注入之二次加解密,DNS注入