千家信息网

JUC的CountDownLatch如何实现

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"JUC的CountDownLatch如何实现",在日常操作中,相信很多人在JUC的CountDownLatch如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2026年11月02日JUC的CountDownLatch如何实现

这篇文章主要介绍"JUC的CountDownLatch如何实现",在日常操作中,相信很多人在JUC的CountDownLatch如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"JUC的CountDownLatch如何实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

CountDownLatch 是一个同步辅助工具,用于阻塞当前一个或多个线程以等待其它线程中的操作完成。在构造 CountDownLatch 对象时,我们需要指定一个非负的 count 值,一般情况下,调用 CountDownLatch#await 方法的线程需要阻塞等待该 count 值变为 0 时才能够继续往下执行。

CountDownLatch 实现内幕

CountDownLatch 在实现上同样依赖于 AQS 组件,在 CountDownLatch 的内部定义了一个 Sync 内部类,该类继承自 AbstractQueuedSynchronizer,并复用 AQS 的 state 字段以记录 count 值的变化。CountDownLatch 的核心方法均委托 Sync 进行处理,实现如下:

public class CountDownLatch {    private final Sync sync;    public CountDownLatch(int count) {        if (count < 0) {            throw new IllegalArgumentException("count < 0");        }        this.sync = new Sync(count);    }    public void await() throws InterruptedException {        sync.acquireSharedInterruptibly(1);    }    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));    }    public void countDown() {        sync.releaseShared(1);    }    public long getCount() {        return sync.getCount();    }}

下面我们主要分析一下 CountDownLatch#await 和 CountDownLatch#countDown 方法的实现。

首先来看一下 CountDownLatch#await 方法,该方法用于阻塞当前线程,直到 count 值变为 0,或者被其它线程中断。具体实现上,CountDownLatch 直接将请求委托给 AQS 的 AbstractQueuedSynchronizer#acquireSharedInterruptibly 方法进行处理,所以我们下面主要来看一下 CountDownLatch 针对模板方法 AbstractQueuedSynchronizer#tryAcquireShared 的实现,如下:

protected int tryAcquireShared(int acquires) {    return (getState() == 0) ? 1 : -1;}

实现上非常简单,获取并判定状态值是否为 0,如果是则说明当前线程获取资源成功,能够继续往下执行,否则说明当前线程获取资源失败,需要被添加到同步队列阻塞等待。CountDownLatch 还为 CountDownLatch#await 方法定义了超时版本 CountDownLatch#await(long, TimeUnit)。

继续来看一下 CountDownLatch#countDown 方法,该方法用于将 count 值减 1,如果发现 count 值变为 0,则唤醒阻塞等待的线程。具体实现上,CountDownLatch 同样直接将请求委托给 AQS 的 AbstractQueuedSynchronizer#releaseShared 方法进行处理,所以我们下面主要来看一下 CountDownLatch 针对模板方法 AbstractQueuedSynchronizer#tryReleaseShared 的实现,如下:

protected boolean tryReleaseShared(int releases) {    // Decrement count; signal when transition to zero    for (; ; ) {        // 获取 state 状态值        int c = getState();        // 如果已经为 0 则说明没有资源可以释放,直接返回 false,避免 state 变为负值        if (c == 0) {            return false;        }        // 资源数减 1        int nextc = c - 1;        if (compareAndSetState(c, nextc)) {            // 如果为 0,则说明资源全部释放完毕,此时需要唤醒等待的线程            return nextc == 0;        }    }}

具体实现如代码注释,比较简单。需要注意的一点就是上面步骤中的判 0 操作,刚开始看的时候可能觉得有点多余,但是这一步的主要作用在于保证 state 值不会变为负值。当前 count 值变为 0 时,上述方法会返回 true,接下去 AQS 会执行唤醒之前因为 count 值不为 0 而被打入同步队列的线程。

到此,关于"JUC的CountDownLatch如何实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

方法 线程 资源 阻塞 学习 同步 处理 委托 更多 模板 状态 状态值 负值 队列 帮助 实用 成功 接下来 代码 作用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司起名 广州善班互联网科技 互联网前沿科技 国外互联网科技网站 甘肃拓世互联网科技有限公司 哈尔滨秒房互联网科技有限公司 互联网科技中介 互联网科技寓意 互联网系的金融科技公司 顶级互联网科技成果有哪些 贵州叶脉互联网科技有限公司所属行业 搜狐科技互联网 洛阳昕诺飞互联网科技有限公司 佛山市翊博互联网络科技有限公司 卓翼科技产业互联网合作 国大互联网教育科技有限公司薪资 陕西云淼互联网科技公司 版纳互联网科技选哪家 科技和互联网行业的特点 宁波允成互联网科技有限公司 互联网最新的科技有限公司 网络科技有限互联网 小马过河互联网科技 南京欣网互联网科技 互联网金融中的现代科技 花神(南京)互联网科技有限公司 千方科技属于互联网企业吗 深圳市优智互联网科技有限公司 科技大学互联网 沐思想互联网科技有限公司
0