直接回答:CountDownLatch 是一个或多个线程等待另外 N 个事件完成;CyclicBarrier 是一组线程互相等待,全部到达屏障点后一起放行。前者计数归零后不可重置(一次性),后者可以循环复用。
展开解析:
- CountDownLatch:构造时给定计数,任务线程完成后
countDown(),等待方await()阻塞到计数为 0。典型场景:主线程等待多个子任务全部就绪(如并行加载多个资源后再启动服务)。 - CyclicBarrier:N 个线程各自执行到
await(),第 N 个到达时触发可选的barrierAction(由最后到达的线程执行),然后所有人同时继续,之后计数自动复位进入下一轮。典型场景:多线程分阶段并行计算,每轮结束汇总一次结果。
实现差异:CountDownLatch 基于 AQS 共享模式(state 即剩余计数,减到 0 时唤醒所有等待者);CyclicBarrier 基于 ReentrantLock + Condition,内部用"代(generation)"区分各轮,某线程中断会打破栅栏导致其他线程收到 BrokenBarrierException。
记忆口诀:CDL 是"等别人做完事",CB 是"等人齐再一起走"。追问:两者与 Phaser 的关系、CDL 能否用 CB 模拟。