CyclicBarrier 与 CountDownLatch 的核心区别在于等待模型、计数方向、可重用性和异常响应:前者是线程间相互等待、凑齐人数、可重用、异常联动;后者是单向计数归零、一次性使用、异常隔离。

核心区别在于:CyclicBarrier 的 await() 是一组线程彼此“等齐步”,必须全部到达才一起放行;CountDownLatch 的 countDown() + await() 是单向“计数归零”,谁减谁不减、谁等谁不等,完全解耦。
等待逻辑完全不同
CyclicBarrier 要求所有参与线程都调用一次 await(),才能共同越过屏障。任意一个线程没到,其余线程就在 await() 处挂起不动——这是真正的“相互等待”。
CountDownLatch 中,await() 只由等待方(通常是主线程)调用一次;countDown() 由执行方(子线程)各自调用,彼此无感知。子线程不关心谁在等,主线程也不管谁减了、谁还没减——这是典型的“单向通行”模型。
计数方向与语义相反
CountDownLatch 是倒计时:构造时设总数 N,每调一次 countDown() 就减 1,直到归零,await 才返回。
CyclicBarrier 是凑人数:构造时设阈值 N,每调一次 await() 就算一人到位,凑满 N 个才集体释放。它内部不是“减”,而是“累加到达数”,只是对外不暴露计数过程。
可重用性决定使用边界
CountDownLatch 一次性生效:一旦计数归零,后续再调 await() 立即返回,无法重置;适合“启动一次、等待一次”的场景,如初始化完成通知、批量任务收尾汇总。
CyclicBarrier 可循环复用:每次全员 await 通过后,内部自动重置为初始状态;适合需要多轮协同的场景,如多阶段并行计算、分批数据处理、模拟周期性同步点(如每轮赛跑重置起跑线)。
异常响应机制体现协作深度
CyclicBarrier 在任一线程 await 时被中断或超时,会触发 BrokenBarrierException,并传播给所有已等待线程——说明它把这一组线程视为一个协作整体,一损俱损。
CountDownLatch 没有这种联动异常:一个子线程中断不会影响其他 countDown 或主线程 await;主线程 await 被中断,也只是自身抛出 InterruptedException,其余子线程照常运行——它只做“信号传递”,不绑定执行生命周期。

















