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

应用场景扩展

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

  • 分布式机器学习中的参数同步
  • 多阶段流水线处理
  • 游戏服务器中的帧同步
  • 蒙特卡洛模拟的分阶段统计
相关推荐
噢,我明白了1 小时前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
通往曙光的路上1 小时前
mysql1
java
2301_809204703 小时前
bootstrap怎么实现鼠标悬停切换图片预览功能
jvm·数据库·python
Tigshop开源商城5 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
坚果派·白晓明7 小时前
【鸿蒙PC三方库移植适配框架解读系列】第八篇:扩展lycium框架使其满足rust三方库适配
c语言·开发语言·华为·rust·harmonyos·鸿蒙
花间相见7 小时前
【PaddleOCR教程01】PP-OCRv5 全面指南:从模型架构到实战部署
开发语言·r语言
小短腿的代码世界7 小时前
Qt 股票订单撮合引擎:高频交易系统的核心心脏
开发语言·数据库·qt·系统架构·交互
Tigshop开源商城7 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
REDcker8 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
kobesdu9 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2