什么是 Java 的 CyclicBarrier?

Sherwin.Wei Lv7

什么是 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