尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CyclicBarrier 源码

CyclicBarrier 源码
📅 发布时间:2026/7/11 4:10:18

成员变量

// 独占可重入锁,所有操作加锁保证线程安全privatefinalReentrantLocklock=newReentrantLock();// 条件变量,所有到达栅栏的线程阻塞在此privatefinalConditiontrip=lock.newCondition();// 总等待线程数(固定不变,final)privatefinalintparties;// 最后一个线程到达时执行的回调任务privatefinalRunnablebarrierCommand;// 当前代次实例privateGenerationgeneration=newGeneration();// 当前剩余等待线程数(每轮从parties递减到0)privateintcount;

构造方法

// 带屏障任务publicCyclicBarrier(intparties,RunnablebarrierAction){if(parties<=0)thrownewIllegalArgumentException();this.parties=parties;this.count=parties;this.barrierCommand=barrierAction;}// 无屏障任务,委托上面构造器publicCyclicBarrier(intparties){this(parties,null);}

Generation

privatestaticclassGeneration{booleanbroken=false;// true=本轮栅栏损坏}

await

publicintawait()throwsInterruptedException,BrokenBarrierException{try{returndowait(false,0L);}catch(TimeoutExceptiontoe){thrownewError(toe);// timed=false不会触发超时,不可能走到这里}}

dowait

privateintdowait(booleantimed,longnanos)throwsInterruptedException,BrokenBarrierException,TimeoutException{finalReentrantLocklock=this.lock;// 加锁,串行修改共享变量lock.lock();try{finalGenerationg=generation;if(g.broken)thrownewBrokenBarrierException();if(Thread.interrupted()){breakBarrier();thrownewInterruptedException();}// 等待计数-1,index是当前线程到达序号(最后一个为0)intindex=--count;// 所有线程全部抵达,触发栅栏if(index==0){// trippedbooleanranAction=false;try{finalRunnablecommand=barrierCommand;if(command!=null)command.run();ranAction=true;// 重置栅栏,开启下一轮nextGeneration();return0;}finally{if(!ranAction)breakBarrier();// 屏障任务执行异常,栅栏损坏}}// loop until tripped, broken, interrupted, or timed outfor(;;){try{if(!timed)trip.await();elseif(nanos>0L)nanos=trip.awaitNanos(nanos);}catch(InterruptedExceptionie){if(g==generation&&!g.broken){breakBarrier();throwie;}else{Thread.currentThread().interrupt();}}if(g.broken)thrownewBrokenBarrierException();if(g!=generation)// 代次更新,说明本次 count 已经为 0,栅栏放行,返回序号returnindex;if(timed&&nanos<=0L){// 超时未集齐线程,破坏栅栏抛超时异常breakBarrier();thrownewTimeoutException();}}}finally{lock.unlock();}}

nextGeneration

privatevoidnextGeneration(){// 1. 唤醒当前代所有阻塞在trip条件队列的线程trip.signalAll();// 2. 重置等待计数器为初始总线程数count=parties;// 3. 新建Generation实例,切换到全新一代,旧代作废generation=newGeneration();}

breakBarrier

privatevoidbreakBarrier(){// 1. 标记当前代栅栏损坏generation.broken=true;// 2. 重置计数器count=parties;// 3. 唤醒所有等待线程trip.signalAll();}

总结

线程调用 barrier.await() ↓ dowait(timed=false, nanos=0) ↓ lock.lock() → 抢占独占锁 ↓ 读取当前代 Generation g = generation ├─ if g.broken → 抛 BrokenBarrierException,finally释放锁 └─ 校验当前线程是否中断 Thread.interrupted() ├─ 是 → breakBarrier() + 抛 InterruptedException,释放锁 └─ 否 → count = count - 1,得到当前index ├─────────────────────┬ ↓ ↓ index == 0(最后线程) index != 0(普通等待线程) ↓ ↓ 执行 barrierCommand 进入 for(;;) 循环阻塞 │ │ │ │→ trip.await() │ │ │ ↓(被signalAll唤醒后)重新竞争lock锁 │ │ │ ├─ g != generation → 正常return index ↓ 任务执行成功 → nextGeneration() │ ↓ │ trip.signalAll() 唤醒所有条件队列线程 │ count重置为parties │ new Generation() 切换代次 ↓ finally 释放锁 lock.unlock()

相关新闻

  • 2026成都本地正规跟团游旅行社行业名录盘点 - 互联网科技品牌测评
  • 【LSTM实战】晶圆缺陷预测:提前2小时发出预警,让我救回了整批Wafer
  • AI智能体实战:从LLM到规划推箱子,揭秘复杂推理架构

最新新闻

  • AI技术民主化:政策影响下的合规架构与资源调度策略
  • 上海积家回收价格查询和各大平台实测排行(2026年7月最新数据) - 积家官方售后服务中心
  • 2026上海企业布局生成式搜索:GEO系统要点与选择核验指南 - 企智芯
  • 锂离子电池过压保护与BQ29200智能平衡方案解析
  • 车载HMI设计规范解析:12.3英寸屏1920x720px适配与3秒交互原则
  • 1 年国内预科直通多国本科!西安交通大学 IFC 国际本科预科项目优势一览 - 资讯纵览

日新闻

  • OpenClaw本地部署:一键直连微信的私有化AI Agent实战指南
  • Kubernetes 系列【10】控制器:ReplicaSet(副本集)
  • 怎么寄快递才能便宜呢?2026年7月寄快递省钱攻略 - 生活情报姬

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号