什么是 Java 的 CyclicBarrier?
·
CyclicBarrier是Java并发编程中的同步工具类,允许一组线程互相等待,直到所有线程都达到一个公共的屏障点后,再一起执行
核心的工作原理是基于一个计数器和“代”的概念来实现的
1.初始化:每次创建一个CycliBarrie时,需要指定参与同步的线程数量,内部计数器初始值即为该值
2.每个线程在执行过程中通过调用await方法表示它已经到达了屏障点。调用后,该线程会被阻塞
3.每当一个线程调用await,内部计数器会减1
4.当计数器减至0时,表示所有线程都已经到达屏障。此时,所有被阻塞时的线程会被同时唤醒,继续执行后续任务。并且,CycliBarrier会自动重置计数器,以便下次循环使用
如果在等待过程中,有线程被中断、等待超时,或者调用了 reset() 方法,屏障会被标记为 “损坏”(broken)。此时,所有在屏障处等待的线程都会抛出 BrokenBarrierException 异常,避免无限期等待
示例代码如下:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
// 创建一个需要3个线程等待的屏障,并设置屏障动作
CyclicBar barrier = new CyclicBarrier(3, () -> {
System.out.println("所有线程已就位,开始执行下一步!");
});
for (int i = 0; i < 3; i++) {
final int threadNum = i;
new Thread(() -> {
try {
System.out.println("线程" + threadNum + "正在准备...");
Thread.sleep((threadNum + 1) * 1000); // 模拟准备耗时
System.out.println("线程" + threadNum + "准备就绪,等待其他线程");
barrier.await(); // 等待其他线程
System.out.println("线程" + threadNum + "开始执行后续任务");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
| 特性 | CyclicBarrier | CountDownLatch |
| 核心作用 | 让一组线程互相等待,到达屏障后一起继续执行 | 让一个或多个线程等待其他线程完成工作 |
| 线程角色 | 所有线程角色相同,都是参与者 | 有明确的等待线程和计数线程之分 |
| 可重用性 | ✅ 可重复使用,屏障打开后自动重置 | ❌ 一次性使用,计数归零后失效 |
| 计数器变化 | 内部计数器自动重置 | 计数器递减,且不能重置 |
| 屏障动作 | ✅ 支持,所有线程到达后可由最后一个线程执行特定任务 | ❌ 不支持 |
| 适用场景 | 多阶段并行计算、分批次任务处理 | 主线程等待子线程完成、资源初始化 |
更多推荐

所有评论(0)