CountDownLatch源码解析

本文深入解析了CountDownLatch的实现机制,包括其如何通过递减AQS的同步状态state来实现闭锁控制,以及await和countDown方法的具体工作流程。

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

CountDownLatch 通过递减 AQS 同步状态 state 来实现闭锁的控制。

// CountDownLatch
public CountDownLatch(int count) {
    if (count < 0) throw new IllegalArgumentException("count < 0");
    this.sync = new Sync(count); // 构建同步器
} 
// CountDownLatch.Sync
Sync(int count) {
    setState(count);
}
// CountDownLatch
public void await() throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
}

await 方法调用响应中断的共享锁获取方法 acquireSharedInterruptibly,最终会调用到自己实现的 tryAcquireShared 方法

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

分析 tryAcquireShared 返回值,同步状态 state0 返回 1,代表获取锁成功,大于 0 返回 -1 代表获取锁失败,进行阻塞等待。countDown 方法通过递减 AQS 的同步状态 state 变量直到为 0,然后唤醒被 await 方法阻塞的线程。

public void countDown() {
    sync.releaseShared(1);
}

countDown 方法会调用释放共享锁 releaseShared 方法,进而调用自己重写的tryReleaseShared 方法,通过尝试设置 state 变量来释放共享锁。

// AbstractQueuedSynchronizer
public final boolean releaseShared(int arg) {
    if (tryReleaseShared(arg)) {
        doReleaseShared(); // 释放共享锁
        return true;
    }
    return false;
}
// CountDownLatch.Sync	
protected boolean tryReleaseShared(int releases) {
    // 循环
    for (;;) {
        // state状态值为0说明已经释放锁,直接返回false无需再次执行唤醒操作
        int c = getState();
        if (c == 0)
            return false;
        int nextc = c-1; // state自减
        // CAS设置state值
        if (compareAndSetState(c, nextc))
            return nextc == 0; // 判断state值是否等于为0,相等返回true执行共享锁释放操作
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值