CountDownLatch作为开发中最常用的组件,也作为面试中被问到的最高频的锁之一,我们有必要来聊聊它的作用以及内部构造。
首先尝试用一句话对CountDownLatch进行概括:CountDownLatch基于AQS,它实现了闩锁,在开发中可以将其用作任务计数器。
简单直译过来就是:CountDownLatch 这种同步工具允许一条或多条线程等待其他线程中的一组操作完成后,再继续执行。
例子
好像还是有点拗口,举个简单的例子来辅助理解一下。
比如我需要收集七颗龙珠才能召唤神龙,这七颗龙珠没有相互依赖关系。如果一颗一颗收集太慢了,那么更好的方式就是派出七个人,每个人都帮我去收集其中一颗,这样效率就能够大大提升。从编程的角度来说,这里需要建立七个工作线程分别同时去寻找指定编号的龙珠,然后主线程来完成召唤神龙的操作。
但这里就存在一个问题,因为每条工作线程找到相应龙珠需要花费的时间不一样,那么主线程需要等待多久?怎么才能得到“所有龙珠都已经被工作线程找到了的这个信息呢”
这里就是 CountDownLatch这个同步工具的用武之地,正如它的介绍那样,它能够帮助主线程在等待其他工作里的任务完成之后,再继续执行。
看完这个例子(https://www.bilibili.com/video/BV1Uy4y117S6/),有的读者可能依然会存在疑惑:有些情况下,可能某个子任务耗时过长,甚至内部出现异常,主线程难道会无休止的等待下去吗?这可能会导致主线程长时间阻塞,表现为