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​
​核心作用​ 让一组线程互相等待,到达屏障后一起继续执行 让一个或多个线程等待其他线程完成工作
​线程角色​ 所有线程角色相同,都是参与者​ 有明确的等待线程和计数线程之分
​可重用性​ ✅ ​可重复使用,屏障打开后自动重置 ❌ ​一次性使用,计数归零后失效
​计数器变化​ 内部计数器自动重置​ 计数器递减,且不能重置
​屏障动作​ ✅ 支持,所有线程到达后可由最后一个线程执行特定任务 ❌ 不支持
​适用场景​ 多阶段并行计算、分批次任务处理 主线程等待子线程完成、资源初始化

更多推荐