Java并发工具箱:CountDownLatch与CyclicBarrier使用指南

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构造函数第二个参数可指定所有线程到达屏障后的回调动作,本例中输出提示信息。

异常处理

需要捕获InterruptedExceptionBrokenBarrierException,前者表示线程被中断,后者表示屏障被重置或损坏。

典型输出示例

复制代码
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

应用场景扩展

该模式适用于需要定期同步的并行计算场景,例如:

  • 分布式机器学习中的参数同步
  • 多阶段流水线处理
  • 游戏服务器中的帧同步
  • 蒙特卡洛模拟的分阶段统计
相关推荐
syker2 小时前
AIFerric v2.0 项目总结报告
c语言·开发语言·c++
亦暖筑序2 小时前
Spring AI Alibaba + RAG 实战:知识库检索模块从设计到落地
java·开源
u0109147602 小时前
JavaScript中类的装饰器提案在属性与方法上的应用
jvm·数据库·python
MeAT ITEM2 小时前
ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇
java·spring boot·后端
ekuoleung2 小时前
Spring Boot 3.4 + Java 21 在量化平台中的架构实践
java·架构
周杰伦fans2 小时前
C# CAD二次开发:RotatedDimension 文字边框设置完全指南
开发语言·c#
Absurd5872 小时前
Laravel Eloquent 中精准检测时间区间重叠的完整实践指南
jvm·数据库·python
djjdjdjdjjdj2 小时前
如何快速查询SQL中的重复记录:GROUP BY与COUNT统计
jvm·数据库·python
2301_782659182 小时前
Redis怎样监控当前发生了多少次内存驱逐
jvm·数据库·python