Java 并发面试题, 什么是 Java 的 CyclicBarrier?
Java 并发面试题, 什么是 Java 的 CyclicBarrier?
QA
Step 1
Q:: 什么是 Java 的 CyclicBarrier?
A:: CyclicBarrier 是 Java 并发工具包 (java.util.concurrent) 中的一个同步辅助类,允许一组线程互相等待,直到到达一个共同的屏障点(即 barrier)。这个屏障可以在程序中被重复使用,故名 'Cyclic'
。CyclicBarrier 适用于一组固定数量的线程需要互相等待以便在继续之前执行某个动作的场景。
Step 2
Q:: CyclicBarrier 和 CountDownLatch 有什么区别?
A:: CyclicBarrier 和 CountDownLatch 都用于多线程的协调,但它们有不同的使用场景和特性。CountDownLatch 主要用于一个或多个线程等待一组操作完成(一次性使用),而 CyclicBarrier 用于一组线程互相等待并多次重用(可循环使用)。此外,CyclicBarrier 允许在所有线程到达屏障点时执行一个可选的 Runnable 任务。
Step 3
Q:: 如何创建和使用 CyclicBarrier?
A:: CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程已到达屏障点")); 这里创建了一个具有 3 个参与者的 CyclicBarrier,当这 3 个线程都调用 await() 方法时,屏障点就会触发,并执行可选的 Runnable 任务。在实际使用中,每个线程会调用 barrier.await() 方法,当最后一个线程调用 await()
时,所有线程将继续执行。
Step 4
Q:: CyclicBarrier 的应用场景有哪些?
A:: CyclicBarrier 适用于那些需要一组线程在继续执行之前互相等待的场景。例如:1. 多线程分段计算结果合并。2. 模拟多线程同时启动的测试。3.
并行任务中的阶段性处理。
Step 5
Q:: CyclicBarrier 如何处理异常情况?
A:: 当某个线程在等待时中断或超时时,CyclicBarrier 会抛出 BrokenBarrierException 并且屏障被打破(broken),所有等待中的线程将立即收到异常并且后续的 await() 调用将立即返回异常。可以通过 barrier.reset()
方法重置屏障。