【JUC】CountDownLatch

发布时间:2026/10/31 7:08:34

【JUC】CountDownLatch CountDownLatch 详解CountDownLatch是 Java 并发包java.util.concurrent中的一个同步工具类用于协调多个线程之间的同步让一个或多个线程等待其他线程完成操作后再继续执行。核心原理CountDownLatch 内部维护一个计数器初始化时指定计数大小每当调用countDown()方法计数减 1当计数减到 0 时所有因调用await()而阻塞的线程会被唤醒计数无法重置这是与 CyclicBarrier 的重要区别主要方法方法说明CountDownLatch(int count)构造方法指定初始计数await()阻塞当前线程直到计数为 0await(long timeout, TimeUnit unit)带超时的等待countDown()计数减 1减到 0 时唤醒等待线程getCount()获取当前计数典型使用场景场景一主线程等待多个子线程完成publicclassCountDownLatchDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{inttaskCount3;CountDownLatchlatchnewCountDownLatch(taskCount);for(inti0;itaskCount;i){finalinttaskIdi;newThread(()-{try{System.out.println(任务 taskId 开始执行);Thread.sleep(1000);System.out.println(任务 taskId 执行完毕);}catch(InterruptedExceptione){e.printStackTrace();}finally{latch.countDown();// 关键无论成功失败都要减1}}).start();}latch.await();// 主线程阻塞等待System.out.println(所有任务执行完毕主线程继续);}}场景二多个线程等待同一信号并发起跑publicclassStartSignalDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{CountDownLatchstartSignalnewCountDownLatch(1);// 发令枪for(inti0;i5;i){finalintrunnerIdi;newThread(()-{try{startSignal.await();// 所有运动员等待发令System.out.println(运动员 runnerId 起跑);}catch(InterruptedExceptione){e.printStackTrace();}}).start();}Thread.sleep(2000);System.out.println(发令枪响);startSignal.countDown();// 所有等待线程同时被唤醒}}场景三组合使用等待开始 等待结束CountDownLatchstartSignalnewCountDownLatch(1);CountDownLatchdoneSignalnewCountDownLatch(N);for(inti0;iN;i){newThread(()-{try{startSignal.await();// 等待开始信号doWork();doneSignal.countDown();// 完成后通知}catch(InterruptedExceptione){e.printStackTrace();}}).start();}startSignal.countDown();// 发出开始信号doneSignal.await();// 等待所有任务完成实现原理简析基于AQSAbstractQueuedSynchronizer的共享模式实现// 简化示意publicclassCountDownLatch{privatestaticfinalclassSyncextendsAbstractQueuedSynchronizer{Sync(intcount){setState(count);}protectedinttryAcquireShared(intacquires){return(getState()0)?1:-1;// state为0表示可以获取}protectedbooleantryReleaseShared(intreleases){for(;;){intcgetState();if(c0)returnfalse;intnextcc-1;if(compareAndSetState(c,nextc)){returnnextc0;// 减到0时触发唤醒}}}}}与 CyclicBarrier 对比特性CountDownLatchCyclicBarrier计数方向递减到 0递增到指定值可否重用❌ 不可重置✅ 可循环使用等待关系一个/多个线程等 N 个线程N 个线程互相等待应用场景主等子、发令枪分阶段任务、多线程对齐注意事项countDown()应放在 finally 中避免任务异常导致计数不减、其他线程永久阻塞不可重复使用计数归零后await()会立即返回需要重置场景请用CyclicBarrierawait()可被中断会抛出InterruptedException建议用带超时的await避免死等造成线程资源浪费计数不能为负构造时 count 0 会抛IllegalArgumentException底层一句话总结CountDownLatch 通过 AQS 的共享锁机制维护一个 state 计数await()在 state ! 0 时入队阻塞countDown()递减 state减到 0 时通过unpark唤醒所有等待线程。
延伸阅读

更多相关文章

2026/10/31 7:03:34

什么是企业战略解码?

很多企业不缺战略。 年度经营会上,管理层对增长、市场拓展、利润提升都有明确规划。但到了部门层面,各自忙着完成自己的指标;到了员工层面,又变成了日常事务。 最终,企业有战略,部门有目标,员…

2026/10/31 8:18:41

AI模拟约会匹配算法:实验揭示的三大翻车场景

1. 项目背景与核心思路 这个实验源于我对现代约会软件匹配算法的好奇。作为每天处理海量用户数据的平台,它们宣称能通过AI精准预测用户喜好,但实际匹配效果却常常令人啼笑皆非。我决定用AI模拟100次真实用户的匹配过程,看看算法推荐的"理…

2026/10/31 8:18:41

开源本体Semantica源码精读:实体去重、相似度聚类与冲突解决

开源本体Semantica 源码精读(04):实体去重、相似度聚类与冲突解决 实话说,Semantica这套开源本体平台读到第四篇,我反而觉得最值钱的逻辑不在最显眼的查询与推理引擎,而藏在实体入库之后的那条清洗链路上。…

2026/10/31 8:18:41

股票交易策略可视化:从数据到交互式分析

1. 项目背景与核心价值 股票交易策略的可视化研究是金融科技领域的重要课题。随着大数据和人工智能技术的发展,金融数据分析已经从传统的统计建模转向更直观、交互性更强的可视化呈现。这种转变让复杂的交易策略能够以更友好的方式被理解和验证。 在量化投资领域&a…

2026/10/31 8:18:41

云原生核心技术解析:容器化、微服务与DevOps实践

1. 云原生技术全景图:从概念到落地 云原生技术体系就像一套精心设计的乐高积木,每个组件都有其独特作用,又能完美组合。这套体系主要由三大核心支柱构成:容器化技术、微服务架构和DevOps实践。它们共同解决了传统单体应用在云环境…

2026/10/31 8:18:41

安德斯·海尔斯伯格的编程哲学与语言设计智慧

1. 安德斯海尔斯伯格的编程哲学启示录 作为Turbo Pascal、Delphi、C#和TypeScript之父,安德斯海尔斯伯格(Anders Hejlsberg)的职业生涯贯穿了编程语言发展的关键时期。这位丹麦计算机科学家用代码改变了数百万开发者的工作方式,其…

2026/10/31 8:13:41

通信工程师职业道德:责任、诚信与专业实践

1. 通信工程师职业道德概述 作为一名通信工程师,职业道德是我们职业生涯的基石。通信行业作为现代社会基础设施的重要组成部分,承载着信息传递、社会运转的重要使命。我们的工作不仅关乎技术实现,更直接影响着国家安全、经济发展和民生福祉。…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑