在Java中如何使用CyclicBarrier同步多个线程_Java线程同步工具解析-java教程

该用 CyclicBarrier 而不是 CountDownLatch 的场景是需要多线程分阶段协作且屏障可重用时,如多玩家回合同步、mini-batch 数据校验;因其可重置,而 CountDownLatch 仅适用于一次性初始化等待。

什么时候该用 CyclicBarrier 而不是 CountDownLatch

核心区别在于复用性:CyclicBarrier 可重置、可重复使用;CountDownLatch 一旦计数归零就不可逆。如果你的任务是「多线程分阶段协作」,比如每轮都需等所有线程到达某个检查点再一起继续(如并行计算的迭代步、模拟中的时间片同步),CyclicBarrier 更合适。

常见误用场景:用 CountDownLatch 做阶段性等待——结果只能用一次,第二轮就得新建实例,逻辑臃肿且易出竞态。

  • 适合 CyclicBarrier:多玩家回合制游戏每轮同步、分布式测试中多个客户端统一启停、机器学习 mini-batch 训练前的数据校验同步
  • 不适合:一次性初始化等待(如服务启动时加载配置),选 CountDownLatch 更轻量

CyclicBarrier 构造与基本用法要点

最常用构造函数是 new CyclicBarrier(int parties),parties 表示需要等待的线程总数。注意:这个数必须和实际调用 await() 的线程数严格一致,少一个则永远阻塞,多一个会抛 BrokenBarrierException。

关键行为:每个线程调用 await() 后被挂起,直到第 parties 个线程调用,所有线程才同时唤醒继续执行。

立即学习“Java免费学习笔记(深入)”;

  • await() 是可中断的,若线程在等待时被 interrupt(),抛 InterruptedException,屏障自动进入破损状态
  • 可选构造函数 new CyclicBarrier(int parties, Runnable barrierAction),由最后一个到达的线程执行该回调,常用于汇总结果或日志记录
  • 回调 barrierAction 若抛异常,会导致所有等待线程收到 BrokenBarrierException

如何安全处理 BrokenBarrierException 和屏障破损

BrokenBarrierException 不仅在屏障被中断时抛出,也出现在任一线程在 await() 中超时、异常退出、或 barrierAction 抛异常之后。此时屏障已损坏,后续所有 await() 都会立即抛该异常,除非手动重置。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java中如何使用CyclicBarrier同步多个线程_Java线程同步工具解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4011126+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4011126+
  • 本周更新: 0+
  • 最后更新: 2026-03-16