讲师中心 微信公众号
AI工具推荐 视频效率加速

详解Java中的循环屏障(CyclicBarrier)_栅栏机制在并行计算中的使用

老辰小哥_4526

老辰小哥_4526

发布时间:2026-02-24 13:33:45

|

862人浏览过

|

来源于php中文网

原创

该用 CyclicBarrier 而不是 CountDownLatch 时:需线程组多次协同到达同一屏障点并一起继续执行,且要求可重用;CountDownLatch 仅适用于一次性等待操作完成。

详解java中的循环屏障(cyclicbarrier)_栅栏机制在并行计算中的使用

什么时候该用 CyclicBarrier 而不是 CountDownLatch

核心区别在「可重用性」和「等待触发点」:CyclicBarrier 是一组线程互相等待彼此到达某个点后**一起继续执行**,且能重复使用;CountDownLatch 是一个或多个线程等待**其他线程完成一系列操作**,计数归零后不可重置。

常见错误现象:用 CountDownLatch 做多轮协同(比如每轮 5 个线程同步开始),结果第二轮调用 await() 直接返回——因为 latch 已经被触发过,无法重用。

  • 适合 CyclicBarrier 的场景:并行分段计算后汇总、模拟并发压测(所有线程同时发起请求)、多阶段流水线中各阶段需对齐进度
  • 适合 CountDownLatch 的场景:主线程等子任务全部结束、初始化完成后再启动服务
  • CyclicBarrier 构造时可传入 Runnable,在所有线程到达后、释放前由**最后一个到达的线程**执行一次(常用于汇总逻辑)

CyclicBarrier.await() 的阻塞与中断处理

调用 await() 会阻塞当前线程,直到所有参与线程都调用了它,或发生中断/超时。这点和 Lock.lockInterruptibly() 类似——它响应中断,但不静默吞掉。

常见错误现象:没捕获 InterruptedException,导致线程中断信号丢失,后续逻辑仍执行;或捕获后没恢复中断状态(Thread.currentThread().interrupt()),影响上层调度。

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

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • 必须显式处理 InterruptedException,否则编译不通过(它是 checked exception)
  • 如果不想立即退出,可在 catch 块里调用 Thread.currentThread().interrupt() 恢复中断标记
  • 带超时的 await(long, TimeUnit) 会抛出 TimeoutException,此时 barrier 仍处于 broken 状态,后续调用直接抛 BrokenBarrierException

屏障损坏(BrokenBarrierException)怎么发生的

CyclicBarrier 很脆弱:任一参与线程在 await() 期间被中断、超时、或抛出未捕获异常,整个 barrier 就会进入 broken 状态,后续所有 await() 都立刻抛 BrokenBarrierException。

这不是 bug,是设计使然——避免部分线程卡死或状态不一致。但容易被忽略的是:broken 状态**不会自动恢复**,必须手动调用 reset()(会唤醒所有等待线程并清空状态)。

  • 不要依赖 reset() 来“修复”逻辑错误,它只是重置状态,不解决根本原因
  • 若 barrier 被频繁打破,说明协作逻辑有缺陷(比如某线程总因异常提前退出)
  • isBroken() 可用于检查当前状态,但注意它只反映“是否 broken”,不提供原因

性能与线程安全注意事项

CyclicBarrier 内部用 ReentrantLock + Condition 实现,本身是线程安全的,但它的回调 Runnable 和参与线程共享的数据**不是自动线程安全的**。

常见错误现象:多个线程在 barrier 回调里往同一个 ArrayList 添加数据,结果漏写或 ConcurrentModificationException。

  • 回调 Runnable 由最后一个到达的线程执行,它看到的共享变量是“最新写入”的,但不保证其他线程已刷新到主内存(需 volatile 或同步机制)
  • 避免在回调里做耗时操作(如 I/O、远程调用),否则会拖慢所有等待线程的释放
  • 构造时指定的 parties 数必须和实际调用 await() 的线程数严格匹配;少调用一次,其余线程永远阻塞
实际用的时候,最易被绕过去的是 broken 状态的传播性和 reset 的时机——它不像 new 一个对象那样“干净”,而是带着历史副作用。别指望靠 try-catch + reset 把问题掩盖住。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

794

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4438

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

563

2025.12.01

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

80

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn