interview
java-concurrency
什么是 Java 的 CyclicBarrier

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() 方法重置屏障。

用途

面试这个内容是为了考察候选人对并发编程的理解和掌握程度,尤其是对线程间协调和同步的理解。CyclicBarrier 在实际生产环境中常用于并行计算任务的协调,例如将一个大任务分成多个子任务并行处理,然后等待所有子任务完成以进行汇总处理。这种情况在高性能计算、大数据处理和分布式系统中比较常见。\n

相关问题

🦆
什么是 CountDownLatch?

CountDownLatch 是一个同步工具类,用来协调一个或多个线程,等待其他线程完成一组特定操作。它初始化时带有一个计数器,调用 countDown() 方法会减少计数器,当计数器归零时,所有等待的线程将继续执行。

🦆
什么是 Semaphore?

Semaphore 是一个计数信号量,用来控制同时访问某特定资源的操作数量。它通过 acquire() 和 release() 方法来获取和释放许可,确保并发访问的线程数量不会超过限制。

🦆
什么是 ReentrantLock?

ReentrantLock 是一个可重入的互斥锁,它比 synchronized 关键字提供了更多的功能,如公平锁、可中断锁和尝试锁定等。通过 lock() 和 unlock() 方法控制对共享资源的访问。

🦆
什么是 Phaser?

Phaser 是一个更为灵活和强大的同步工具类,用于协调多个线程阶段性地执行任务。它支持动态调整参与线程的数量和复杂的多阶段任务同步。

🦆
什么是 Exchanger?

Exchanger 是一个同步点,用于在两个线程之间交换数据。两个线程通过 exchange() 方法交换数据,当两者都到达交换点时,交换数据完成并继续执行。