countdownlatch不可重用而cyclicbarrier可重用:前者为一次性倒计时门禁,计数归零后失效;后者为循环集合点,全员到达即放行并自动重置,支持多轮同步协作。

CountDownLatch 是一次性的,就像一扇只能开一次的门——门开了,就永远开着,不能再关回去;CyclicBarrier 是循环的,像一个旋转门,每次所有人都到齐了,它就转一圈放行,然后立刻准备好下一轮。
CountDownLatch:倒计时用完就失效
它内部维护一个整数计数器,调用 countDown() 就减 1,调用 await() 会阻塞直到计数变为 0。一旦变成 0,所有等待线程被唤醒,且之后再调用 await() 就直接通过(不阻塞),countDown() 也继续有效但不再影响状态——它不会重置,也不能重置。
- 比如设为 3,三个线程各调一次 countDown(),计数变 0,await() 立刻返回
- 第四个线程再调 await(),不会等,直接往下走
- 没法“重新设成 3”再用一遍——没提供 reset 方法
CyclicBarrier:到齐就放行,自动准备下一轮
它等待固定数量的线程都调用 await(),只要凑够人数,就一起放行,并自动重置内部状态, ready 下一轮等待。
- 比如设为 4,4 个线程调 await() 后全部同时返回,屏障就“循环”回初始状态
- 第 5 个线程再调 await(),它会等其他 3 个新线程也来,凑满 4 个才再次放行
- 支持手动 reset() 强制重置(会中断所有等待线程),但通常靠它自己循环就够了
类比帮你记住区别
CountDownLatch 像发令枪:裁判喊“预备——跑!”,枪响(计数归零)后比赛开始,枪不能收回重响;CyclicBarrier 像小组打卡机:4 人全刷脸(await)才开门,门开完自动关好,等下一组 4 人再来刷。
选哪个?看你要解决什么问题
如果是一次性协调(比如主线程等所有子任务初始化完成),用 CountDownLatch;如果是重复协作(比如多线程分批处理数据,每批都要等全员就绪再统一推进),就用 CyclicBarrier。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











