当前位置: 首页 > news >正文

CyclicBarrier 源码

成员变量

// 独占可重入锁,所有操作加锁保证线程安全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()
http://www.jsqmd.com/news/1157774/

相关文章:

  • 【Springboot毕设全套源码+文档】基于SpringBoot生鲜商城系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 3步快速解决Windows系统卡顿问题:Windows Cleaner完全指南
  • AI智能体实战:从LLM到规划推箱子,揭秘复杂推理架构
  • HarmonyOS 小游戏《对战五子棋》开发第24篇 - 颜色资源设置
  • 让 feature-dev 与 planning-with-files 打出组合拳
  • 高维数据几何可视化方法综述(学习笔记)
  • 2026成都定制游旅行社行业实测排行名录 - 互联网科技品牌测评
  • 鸽姆智库(GG3M Think Tank) 贾子理论大厦(KTS)研究中心关于立场与方法论原则官方声明
  • 万国回收价格查询与靠谱回收平台实测排行(2026年7月最新数据) - 万国中国官方服务中心
  • 成都劳力士回收价格查询及各大平台实测排行(2026年7月最新数据) - 收的高名表回收平台
  • 虚幻引擎PicoVR开发:PICO XR Plugin与OpenXR Plugin深度对比与选型指南
  • 2026年7月最新深圳帝舵官方售后客服电话及服务网点地址查询 - 帝舵中国官方服务中心
  • 2026年河北齿轮油厂家综合评估与选择参考 - 品牌鉴赏官2026
  • 维度建模实战:电商数仓 6 步构建星型模型,产出 10+ 核心事实/维度表
  • C语言 atoi 函数深度解析:5个关键行为与 strtol 替代方案
  • 164、ATSS 自适应训练样本选择替换 TAL:基于统计 IoU 均值加标准差设动态阈值
  • 厦门宝珀回收价格查询与各大回收平台实测排行(2026年7月最新) - 嘉价奢侈品回收平台
  • 2026年中原区老车翻新贴膜:专业门店选择与威固官方旗舰店价值解析 - 品牌鉴赏官2026
  • SpringBoot Actuator安全漏洞与Linux提权实战:从Web渗透到Root权限获取
  • 免费开源视频下载神器:5分钟掌握VideoDownloadHelper终极使用指南
  • macOS Catalina下Jupyter Notebook配置全指南
  • 代理模式和适配器模式区别
  • 北京欧米茄回收价格查询与靠谱回收平台实测排行(2026年7月最新) - 天价名表回收平台
  • 宝玑中国官方售后服务中心|服务电话及详细网点地址权威信息通告(2026年7月最新) - 亨得利官方服务中心
  • 苏州百达翡丽回收价格查询及靠谱回收平台实测排行(2026年7月最新数据) - 诚收名表回收平台
  • Java Scanner 类精讲:经典坑拆解
  • DyberPet 与 VPet 对比评测:2款开源桌宠框架在功能、性能与生态上的差异
  • 欧米茄进水修复的专业售后维修处理服务权威公示(2026年7月最新) - 欧米茄服务中心
  • 2026年7月最新苏州萧邦官方售后热线及客户服务网点地址 - 萧邦中国官方服务中心
  • PIC18LF26K40驱动EPT-14A4005P蜂鸣器的低功耗警报方案