什么是 Java 的 CyclicBarrier?
什么是 Java 的 CyclicBarrier?
回答重点
CyclicBarrier 是一个同步辅助类,允许一组线程在执行某个任务时相互等待,直到所有线程都到达屏障(barrier)之后才继续执行。它的设计目的是解决多线程并发任务中需要同步的场景,确保所有参与的线程都在特定的点上完成执行,然后一起继续后续的任务。
扩展知识
基本概念
- 屏障(Barrier):一个线程在调用
await()方法时会被阻塞,直到所有参与的线程都到达屏障点。屏障点可以是一个特定的任务步骤。 - 线程数量:
CyclicBarrier需要的线程数量是预设的,当所有线程都到达屏障时,屏障被释放,所有线程可以继续执行。 - 重用性:
CyclicBarrier可以被重用,允许在多个阶段中同步线程。例如,在每个阶段的同步点上都可以使用CyclicBarrier。
构造函数:
CyclicBarrier(int parties):初始化一个CyclicBarrier对象,设置需要等待的线程数量。CyclicBarrier(int parties, Runnable barrierAction):除了设置线程数量外,还可以指定一个Runnable回调,在所有线程到达屏障后执行。
工作原理

它实际上是基于 ReentrantLock 和 Condition 的封装来实现这一功能的。
CyclicBarrier 内部维护了一个计数器,即达到屏障的线程数量,当线程调用 await 的时候计数器会减一,如果计数器减一不等于 0 的时候,线程会调用 condition.await 进行阻塞等待。
如果计数器减一的值等于 0,说明最后一个线程也到达了屏障,于是如果有 barrierAction 就执行 barrierAction ,然后调用 condition.signalAll 唤醒之前等待的线程,并且重置计数器,然后开启下一代,所以它可以循环使用。

在等待期间,如果屏障被打破(即出现异常),其他线程会被通知并抛出 BrokenBarrierException 异常。
使用示例

结果如下:

Comments