Java并发工具包——CyclicBarrier
回顾
上一期Java并发工具包跟大家聊了下CountDownLatch,大家一定记得它的使用场景,那么这期继续给大家说下Java并发工具中的常用工具——CyclicBarrier,这个工具类的使用场景跟CountDownLatch类似,下面跟大家展开说说。
简介
通过类的名称就可以了解一些
- Cyclic——循环、回环
- Barrier——栅栏、屏障
CyclicBarrier就是环形屏障,那么具体是什么意思呢?
很简单,其实就是等待所有回环屏障中的线程都执行到指定位置,才能够继续执行。具体实际的例子就是远途大巴车车满发车。结合CountDownLatch来看的话就比较简单了,CountDownLatch是若干线程等待所有工作的子线程,CyclicBarrier是若干线程等待,所有线程执行完成之后,再继续执行,并且同实例可以重复使用,而且可以通过reset方法重置状态(调用这个方法之后,执行await的方法的地方会抛出BrokenBarrierException异常)。
应用场景
- 多线程计算数据,最后统计核算各个线程的结果
- 多线程业务中,同步节点(类似于JVM中垃圾回收章节的安全点概念)
例子
未使用回环屏障
使用回环屏障
重复使用回环屏障
实现原理
内部实现类似与CountDownLatch,通过计数器来判断是否继续执行,不过CyclicBarrier可以通过reset方法重置。所以CyclicBarrier能处理更为复杂的业务场景,一旦哪个线程计算中发生错误,可以通过重置计数器,并让相关线程重新执行。
源码使用了ReentrantLock进行同步,如果达到最后的一个线程执行await的话,那么index为0,会开始执行barrierCommand的run方法。如果不是最后一个线程,就会进入循环等待的逻辑。
常见面试问题
- 是否使用过CyclicBarrier?
- CyclicBarrier的使用场景?
- CyclicBarrier的常用方法?
- 使用CyclicBarrier遇到过哪些问题,如何解决?