CountDownLatch 与 CyclicBarrier 的核心区别
CountDownLatch
- 一次性使用的同步辅助工具,计数器不可重置
- 主线程等待其他线程完成操作(通过
countDown()减少计数) - 典型场景:启动服务时等待所有组件初始化完成
CyclicBarrier
- 可重复使用的同步屏障,计数器可通过
reset()重置 - 所有线程相互等待到达屏障点(通过
await()阻塞) - 典型场景:并行计算中多阶段任务同步
CountDownLatch 使用示例
初始化时指定计数器大小:
java
CountDownLatch latch = new CountDownLatch(3);
工作线程完成任务后减少计数:
java
public void run() {
// 执行任务逻辑
latch.countDown();
}
主线程等待所有任务完成:
java
latch.await(); // 阻塞直到计数器归零
System.out.println("所有任务已完成");
CyclicBarrier 使用示例
创建屏障并指定回调函数(可选):
java
CyclicBarrier barrier = new CyclicBarrier(3, () ->
System.out.println("所有线程到达屏障点"));
线程执行到同步点时等待:
java
public void run() {
// 第一阶段任务
barrier.await();
// 第二阶段任务
}
关键注意事项
CountDownLatch
await()可设置超时时间避免永久阻塞- 计数归零后所有等待线程立即释放
CyclicBarrier
- 最后一个到达屏障的线程会执行回调函数
- 线程被中断时会抛出
BrokenBarrierException
性能对比场景
适合CountDownLatch的场景
- 主从模式的任务分发与汇总
- 需要明确触发条件的单次事件
适合CyclicBarrier的场景
- 多轮迭代的并行计算
- 需要循环同步的分阶段任务
通过合理选择同步工具,可以显著提升多线程程序的可靠性和性能表现。实际开发中应根据任务拓扑结构决定使用哪种同步原语。
CyclicBarrier多轮迭代并行计算示例
CyclicBarrier适用于需要多线程分阶段执行的场景,以下代码模拟多线程分轮次处理任务,每轮结束后同步等待所有线程完成:
java
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class MultiRoundParallelCompute {
private static final int THREAD_COUNT = 3;
private static final int TOTAL_ROUNDS = 2;
static class Worker implements Runnable {
private final CyclicBarrier barrier;
private final int threadId;
public Worker(int threadId, CyclicBarrier barrier) {
this.threadId = threadId;
this.barrier = barrier;
}
@Override
public void run() {
try {
for (int round = 0; round < TOTAL_ROUNDS; round++) {
System.out.printf("Thread-%d processing round %d\n", threadId, round);
// 模拟计算耗时
Thread.sleep(1000 * (threadId + 1));
System.out.printf("Thread-%d finished round %d, waiting others\n", threadId, round);
barrier.await(); // 等待所有线程完成本轮
}
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT,
() -> System.out.println("All threads reached barrier, proceed to next round"));
for (int i = 0; i < THREAD_COUNT; i++) {
new Thread(new Worker(i, barrier)).start();
}
}
}
代码关键点说明
线程数配置
通过THREAD_COUNT控制参与计算的线程数量,必须与CyclicBarrier构造函数参数一致。
多轮迭代机制
每个线程内部通过for循环执行TOTAL_ROUNDS轮计算,每轮结束后调用barrier.await()同步。
屏障回调函数
CyclicBarrier构造函数第二个参数可指定所有线程到达屏障后的回调动作,本例中输出提示信息。
异常处理
需要捕获InterruptedException和BrokenBarrierException,前者表示线程被中断,后者表示屏障被重置或损坏。
典型输出示例
Thread-0 processing round 0
Thread-1 processing round 0
Thread-2 processing round 0
Thread-0 finished round 0, waiting others
Thread-1 finished round 0, waiting others
Thread-2 finished round 0, waiting others
All threads reached barrier, proceed to next round
Thread-0 processing round 1
Thread-1 processing round 1
Thread-2 processing round 1
gitee.com/zjwno1/wnotqwsl/blob/master/README.md
gitee.com/zjwno1/flpmmtvl/blob/master/README.md
gitee.com/yinshuiyu/ckrjsotf/blob/master/README.md
gitee.com/zjwno1/xzyxtczy/blob/master/README.md
gitee.com/yinshuiyu/peywwfih/blob/master/README.md
gitee.com/zjwno1/vxrhulse/blob/master/README.md
gitee.com/yinshuiyu/uyjjzmyi/blob/master/README.md
gitee.com/zjwno1/ejlnbort/blob/master/README.md
gitee.com/yinshuiyu/fwcvvpbx/blob/master/README.md
gitee.com/zjwno1/mmajcoya/blob/master/README.md
gitee.com/zjwno1/xnovukze/blob/master/README.md
gitee.com/yinshuiyu/bxbiplyk/blob/master/README.md
gitee.com/zjwno1/ufcddtpu/blob/master/README.md
gitee.com/yinshuiyu/rkwcfirb/blob/master/README.md
gitee.com/yinshuiyu/kteokntl/blob/master/README.md
gitee.com/zjwno1/ebzcpfgw/blob/master/README.md
gitee.com/yinshuiyu/cpqbukhj/blob/master/README.md
gitee.com/zjwno1/kcsimppk/blob/master/README.md
gitee.com/yinshuiyu/almvebnw/blob/master/README.md
gitee.com/zjwno1/lrpfefun/blob/master/README.md
gitee.com/yinshuiyu/wegjjvra/blob/master/README.md
gitee.com/zjwno1/duvbsxtf/blob/master/README.md
gitee.com/yinshuiyu/xfpbhnas/blob/master/README.md
gitee.com/zjwno1/ckifploh/blob/master/README.md
gitee.com/yinshuiyu/giwfggaw/blob/master/README.md
gitee.com/zjwno1/zpkryohk/blob/master/README.md
gitee.com/yinshuiyu/slsvocbq/blob/master/README.md
gitee.com/zjwno1/jpwqdgyl/blob/master/README.md
gitee.com/yinshuiyu/uvtmjfix/blob/master/README.md
gitee.com/zjwno1/xfdqspsx/blob/master/README.md
gitee.com/yinshuiyu/ijqeanqy/blob/master/README.md
gitee.com/zjwno1/lpwwqrwo/blob/master/README.md
gitee.com/yinshuiyu/yhdqgnqm/blob/master/README.md
gitee.com/zjwno1/aaysiyqd/blob/master/README.md
gitee.com/yinshuiyu/gxscpyuz/blob/master/README.md
gitee.com/zjwno1/sjcdjxrd/blob/master/README.md
gitee.com/yinshuiyu/larrberu/blob/master/README.md
gitee.com/zjwno1/doppffua/blob/master/README.md
gitee.com/yinshuiyu/kfboleat/blob/master/README.md
gitee.com/zjwno1/vabhovnm/blob/master/README.md
gitee.com/yinshuiyu/vmoybems/blob/master/README.md
gitee.com/zjwno1/veoulbiq/blob/master/README.md
gitee.com/yinshuiyu/dbyyuxbn/blob/master/README.md
gitee.com/zjwno1/imxjskwf/blob/master/README.md
gitee.com/yinshuiyu/ynpdpzpa/blob/master/README.md
gitee.com/zjwno1/dodqajvh/blob/master/README.md
gitee.com/yinshuiyu/akeekkkq/blob/master/README.md
gitee.com/zjwno1/qzxgisia/blob/master/README.md
gitee.com/yinshuiyu/hkgtjewz/blob/master/README.md
gitee.com/zjwno1/nbukrokd/blob/master/README.md
gitee.com/zjbing/wsziokae/blob/master/README.md
gitee.com/yinshuiyu/bjxeluqt/blob/master/README.md
gitee.com/zjwno1/gmepszlc/blob/master/README.md
gitee.com/zjbing/aumrqmcb/blob/master/README.md
gitee.com/yinshuiyu/omukyyxi/blob/master/README.md
gitee.com/zjwno1/adxqnwfp/blob/master/README.md
gitee.com/zjbing/lnfvkybi/blob/master/README.md
gitee.com/yinshuiyu/kryhyvew/blob/master/README.md
gitee.com/zjbing/gdxrrbjj/blob/master/README.md
gitee.com/zjwno1/jzxzftio/blob/master/README.md
gitee.com/yinshuiyu/nbqmobxg/blob/master/README.md
gitee.com/zjbing/usbxdgit/blob/master/README.md
gitee.com/zjwno1/hmkrreoj/blob/master/README.md
gitee.com/yinshuiyu/zfgntssl/blob/master/README.md
gitee.com/zjbing/dqmcjczp/blob/master/README.md
gitee.com/zjwno1/lhefqgyu/blob/master/README.md
gitee.com/yinshuiyu/aqqtudtu/blob/master/README.md
gitee.com/zjbing/xdrtawzc/blob/master/README.md
gitee.com/zjwno1/uexplvrm/blob/master/README.md
gitee.com/yinshuiyu/cboekruz/blob/master/README.md
gitee.com/zjbing/fxmmchqi/blob/master/README.md
gitee.com/zjwno1/ffrrgagn/blob/master/README.md
gitee.com/yinshuiyu/esazizoz/blob/master/README.md
gitee.com/zjbing/zmkrttcg/blob/master/README.md
gitee.com/zjbing/ivivifba/blob/master/README.md
gitee.com/zjwno1/xnhhdjsx/blob/master/README.md
gitee.com/yinshuiyu/afztmwji/blob/master/README.md
gitee.com/zjbing/xvpieded/blob/master/README.md
gitee.com/zjwno1/emgqxgzs/blob/master/README.md
gitee.com/yinshuiyu/fftknhwq/blob/master/README.md
gitee.com/zjbing/ndryexwz/blob/master/README.md
gitee.com/zjwno1/hobadpoh/blob/master/README.md
gitee.com/yinshuiyu/keubuixc/blob/master/README.md
gitee.com/zjbing/rpauuxqp/blob/master/README.md
gitee.com/yinshuiyu/nhjhqgpl/blob/master/README.md
gitee.com/zjwno1/rxxluoir/blob/master/README.md
gitee.com/zjbing/anuncyoq/blob/master/README.md
gitee.com/zjwno1/bxlgvebd/blob/master/README.md
gitee.com/yinshuiyu/qkxmdcmo/blob/master/README.md
gitee.com/zjbing/gofysivc/blob/master/README.md
gitee.com/zjbing/uoiipyxg/blob/master/README.md
gitee.com/yinshuiyu/gucmddmt/blob/master/README.md
gitee.com/zjwno1/thysmcbb/blob/master/README.md
gitee.com/zjbing/rstanagv/blob/master/README.md
gitee.com/yinshuiyu/vvpoqgle/blob/master/README.md
gitee.com/zjwno1/jjiiikhg/blob/master/README.md
gitee.com/zjbing/pnvliefi/blob/master/README.md
gitee.com/yinshuiyu/zhzmiybg/blob/master/README.md
gitee.com/zjwno1/xpqdvyik/blob/master/README.md
gitee.com/zjbing/nkdmmqjo/blob/master/README.md
gitee.com/yinshuiyu/akycnatl/blob/master/README.md
gitee.com/zjwno1/hnehnqnn/blob/master/README.md
gitee.com/zjbing/tpxtgjml/blob/master/README.md
gitee.com/yinshuiyu/zbmnafbi/blob/master/README.md
gitee.com/zjwno1/caymprqm/blob/master/README.md
gitee.com/zjbing/vmdvgjqz/blob/master/README.md
gitee.com/yinshuiyu/mevvzzap/blob/master/README.md
gitee.com/zjbing/mfzxqzlw/blob/master/README.md
gitee.com/zjwno1/qlcsvwot/blob/master/README.md
gitee.com/yinshuiyu/wxjirxwo/blob/master/README.md
gitee.com/zjbing/raxkqyxk/blob/master/README.md
gitee.com/zjwno1/dobgvonp/blob/master/README.md
gitee.com/zjbing/cbfipuoo/blob/master/README.md
gitee.com/yinshuiyu/bxdpwmva/blob/master/README.md
gitee.com/zjwno1/mrnnqdzy/blob/master/README.md
gitee.com/zjbing/pylvztjz/blob/master/README.md
gitee.com/yinshuiyu/ilclblhq/blob/master/README.md
gitee.com/zjwno1/nroomcsv/blob/master/README.md
gitee.com/zjbing/anhoexhx/blob/master/README.md
gitee.com/yinshuiyu/owceavxj/blob/master/README.md
gitee.com/zjwno1/mzdboylq/blob/master/README.md
gitee.com/zjbing/jizplexk/blob/master/README.md
gitee.com/yinshuiyu/cxepcwyo/blob/master/README.md
gitee.com/zjwno1/ysjqqewz/blob/master/README.md
gitee.com/zjbing/krznnqeh/blob/master/README.md
gitee.com/yinshuiyu/rwkekkkf/blob/master/README.md
gitee.com/zjwno1/lxjdkagf/blob/master/README.md
gitee.com/zjbing/rxbtmpfv/blob/master/README.md
gitee.com/yinshuiyu/pypuvszq/blob/master/README.md
gitee.com/zjbing/ixompybm/blob/master/README.md
gitee.com/zjwno1/orjgftnd/blob/master/README.md
gitee.com/yinshuiyu/cnmnaqvv/blob/master/README.md
gitee.com/zjbing/myybxnzs/blob/master/README.md
gitee.com/zjwno1/xhosvjfc/blob/master/README.md
gitee.com/zjbing/lbhlbkmw/blob/master/README.md
gitee.com/yinshuiyu/taellyij/blob/master/README.md
gitee.com/zjwno1/tfdrvcyh/blob/master/README.md
gitee.com/zjbing/llfhtiyb/blob/master/README.md
gitee.com/zjwno1/slyoxcqz/blob/master/README.md
gitee.com/yinshuiyu/mbwahtys/blob/master/README.md
gitee.com/zjbing/wdneilxu/blob/master/README.md
gitee.com/yinshuiyu/rnsuqkie/blob/master/README.md
gitee.com/zjbing/zztwmohg/blob/master/README.md
gitee.com/zjwno1/xpnautip/blob/master/README.md
gitee.com/zjbing/jospiigf/blob/master/README.md
gitee.com/yinshuiyu/uodrlutz/blob/master/README.md
gitee.com/zjwno1/vvgjpmqs/blob/master/README.md
gitee.com/zjbing/bzfcztrl/blob/master/README.md
gitee.com/yinshuiyu/botgkhdg/blob/master/README.md
gitee.com/zjwno1/ovwmogme/blob/master/README.md
应用场景扩展
该模式适用于需要定期同步的并行计算场景,例如:
- 分布式机器学习中的参数同步
- 多阶段流水线处理
- 游戏服务器中的帧同步
- 蒙特卡洛模拟的分阶段统计