当前位置:首页 > Java > 正文

Java循环屏障详解(CyclicBarrie多线程同步利器)

Java并发编程中,有时我们需要多个线程在某个点上“汇合”后再继续执行。这时,CyclicBarrier(循环屏障)就派上了大用场!本文将带你从零开始掌握Java循环屏障的使用方法,即使是编程小白也能轻松理解。

什么是 CyclicBarrier?

CyclicBarrier 是 Java 并发包(java.util.concurrent)中的一个同步辅助类。它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(barrier point),然后一起继续执行。

CountDownLatch 不同的是,CyclicBarrier 是可重用的——一旦所有线程通过了屏障,它可以被重置并再次使用,因此得名“循环”屏障。

Java循环屏障详解(CyclicBarrie多线程同步利器) Java循环屏障  CyclicBarrier教程 Java并发工具 多线程同步 第1张

CyclicBarrier 的基本用法

创建 CyclicBarrier 时,需要指定参与等待的线程数量。每个线程调用 await() 方法表示自己已到达屏障点。当所有线程都调用了 await(),屏障被打破,所有线程继续执行。

简单示例

import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {    public static void main(String[] args) {        int numberOfThreads = 3;        // 创建一个 CyclicBarrier,等待3个线程        CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> {            System.out.println("所有线程已就位,屏障被打破!");        });        for (int i = 0; i < numberOfThreads; i++) {            new Thread(() -> {                try {                    System.out.println(Thread.currentThread().getName() + " 到达屏障...");                    barrier.await(); // 等待其他线程                    System.out.println(Thread.currentThread().getName() + " 继续执行!");                } catch (Exception e) {                    e.printStackTrace();                }            }).start();        }    }}

运行上述代码,你会看到类似以下输出:

Thread-0 到达屏障...Thread-2 到达屏障...Thread-1 到达屏障...所有线程已就位,屏障被打破!Thread-1 继续执行!Thread-0 继续执行!Thread-2 继续执行!

CyclicBarrier 的高级特性

1. 设置屏障动作(Barrier Action)

构造函数中的第二个参数是一个 Runnable 对象,称为“屏障动作”。它会在最后一个线程调用 await() 后、所有线程被释放前执行。这常用于汇总结果或日志记录。

2. 超时等待

await(long timeout, TimeUnit unit) 允许设置超时时间。如果在指定时间内未达到屏障点,会抛出 TimeoutException,此时屏障被视为已损坏(broken),其他等待的线程也会收到 BrokenBarrierException

3. 可重用性

一旦所有线程通过屏障,CyclicBarrier 会自动重置,可以再次用于下一轮同步。这也是它与 CountDownLatch 的关键区别之一。

实际应用场景

  • 多线程并行计算后汇总结果(如 MapReduce 模型)
  • 游戏开发中等待所有玩家准备就绪再开始
  • 测试框架中等待多个服务启动完成再执行测试

常见问题与注意事项

  • 如果某个线程在等待期间被中断,屏障会被破坏,其他线程会抛出 BrokenBarrierException
  • 不要在屏障动作中执行耗时操作,以免阻塞所有线程。
  • 确保参与屏障的线程数量与构造时指定的数量一致,否则程序会一直等待。

总结

CyclicBarrier 是 Java 并发工具箱中非常实用的同步工具,特别适合需要多线程协同工作的场景。通过本教程,你应该已经掌握了 Java循环屏障 的基本用法、高级特性和最佳实践。无论是学习 Java并发工具 还是解决实际的 多线程同步 问题,CyclicBarrier 都是一个值得掌握的利器。

赶快动手试试吧!编写自己的多线程程序,体验 CyclicBarrier 带来的强大同步能力。