直接回答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 模拟。