CountDownLatch适用于一次性等待所有操作完成,不可重置;CyclicBarrier适用于多线程循环协同,可重置并支持屏障中断与回调。二者语义不同,不可互换。
CountDownLatch 适合“等待一组操作全部完成”
它是一次性使用的计数器,初始化时指定一个 count,每次调用 countDown() 就减一,调用 await() 的线程会阻塞直到计数归零。常见于:主线程等所有子任务跑完再继续、服务启动时等待多个组件初始化完毕。
注意点:
-
CountDownLatch不能重置,一旦计数到 0,后续所有await()都立即返回 - 没有“唤醒所有等待线程后自动重置”的机制,所以不适合循环场景
- 如果某线程调用
await()后被中断,会抛InterruptedException,需自行处理
CyclicBarrier 适合“多线程分阶段协同执行”
它更像一个“集合点”,多个线程各自执行一段逻辑后,在 await() 处等待彼此到达;当最后一个线程到达,所有线程同时被释放,并可选择执行一个 Runnable(如汇总统计)。典型场景:并行计算分片处理 + 汇总、多玩家准备就绪后开始游戏回合。
关键行为: