Java并发系列六:JUC.CountDownLatchCountDownLatch

CountDownLatch是一个基于AQS的同步工具,用于主线程等待多个子线程任务完成。它充当任务计数器,当计数值为0时唤醒等待的线程。通过实例解释了如何使用CountDownLatch收集分散的任务并确保所有任务执行完毕。此外,讨论了await方法的超时机制,以及在设计时如何考虑线程间的同步和唤醒逻辑。通过对源码的解析,揭示了CountDownLatch如何利用AQS实现任务的同步和唤醒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CountDownLatch作为开发中最常用的组件,也作为面试中被问到的最高频的锁之一,我们有必要来聊聊它的作用以及内部构造。
首先尝试用一句话对CountDownLatch进行概括:CountDownLatch基于AQS,它实现了闩锁,在开发中可以将其用作任务计数器。

 简单直译过来就是:CountDownLatch 这种同步工具允许一条或多条线程等待其他线程中的一组操作完成后,再继续执行。

例子
好像还是有点拗口,举个简单的例子来辅助理解一下。
比如我需要收集七颗龙珠才能召唤神龙,这七颗龙珠没有相互依赖关系。如果一颗一颗收集太慢了,那么更好的方式就是派出七个人,每个人都帮我去收集其中一颗,这样效率就能够大大提升。从编程的角度来说,这里需要建立七个工作线程分别同时去寻找指定编号的龙珠,然后主线程来完成召唤神龙的操作。

但这里就存在一个问题,因为每条工作线程找到相应龙珠需要花费的时间不一样,那么主线程需要等待多久?怎么才能得到“所有龙珠都已经被工作线程找到了的这个信息呢”
这里就是 CountDownLatch这个同步工具的用武之地,正如它的介绍那样,它能够帮助主线程在等待其他工作里的任务完成之后,再继续执行。

看完这个例子(https://www.bilibili.com/video/BV1Uy4y117S6/),有的读者可能依然会存在疑惑:有些情况下,可能某个子任务耗时过长,甚至内部出现异常,主线程难道会无休止的等待下去吗?这可能会导致主线程长时间阻塞,表现为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值