CountDownLatch原理

简介: 文章讲述了CountDownLatch的工作原理及其用途:1. CountDownLatch是一个简单的同步工具,用于等待一组操作完成。2. 它通过AQS框架实现,利用共享锁模式控制线程的等待与唤醒。3. 适用于多线程环境下,一个线程需要等待多个其他线程完成各自的任务后再继续执行的场景。

CountDownLatch是一种同步辅助工具,允许一个或多个线程等待在其他线程中执行的一组操作完成,可以利用它来实现多线程协调共同完成某些操作,比如多线程共同完成一个大任务。

CountDownLatch 底层维护了一个计数器,所有线程调用countDown()方法后计数器减1,主线程等到直到计数器为0,可以用作发令抢 一个线程等待 所有线程将计数器减少为0,模拟并发的场景。可以一个或者多个线程,等待计数器到0。CountDownLatch的实现很简单,基于AQS实现的共享锁。

AQS实现:

private static final class Sync extends AbstractQueuedSynchronizer {        private static final long serialVersionUID = 4982264981922014374L;                Sync(int count) {            setState(count);        }​        int getCount() {            return getState();        }                protected int tryAcquireShared(int acquires) {            return (getState() == 0) ? 1 : -1;        }        //释放共享锁        protected boolean tryReleaseShared(int releases) {            // Decrement count; signal when transition to zero            for (;;) {                int c = getState();                if (c == 0)                    return false;                int nextc = c-1;                if (compareAndSetState(c, nextc))                    return nextc == 0;            }        }    }
AI 代码解读
countDown方法:
AI 代码解读
public void countDown() {
           sync.releaseShared(1);    }
AI 代码解读

countDown方法不断释放共享锁,state减1,然后唤醒下一个排队加锁的线程,state所有线程共享,没有像ReentrantReadWriteLock那样用ThreadLocal隔离不同线程的锁次数。

await方法: 

public boolean await(long timeout, TimeUnit unit)        throws InterruptedException {
           return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));    }
AI 代码解读

await方法,判断state是否达到了0,如果没有到0则会进入排队和阻塞,实现等待其他线程操作的目的,直到state=0。

Rocketmq扩展:

在Rocketmq中,就对CountDownLatch进行了扩展,添加了重置功能,使得CountDownLatch也可以像CyclicBarrier一样可以循环使用。它将初始化时的state值暂存到startCount上,reset时重新将startCount值设置到state上。

发现CountDownLatch的实现很简单,其实是因为AQS已经提供了很好的抽象,使得实现其他辅助的同步工具类非常简单,因此学好AQS对于学习并发工具是很有用的。

目录
打赏
0
4
4
0
41
分享
相关文章
|
10月前
CountDownLatch实现原理全面解析
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步(即:用于线程之间的通信而不是互斥)。它允许一个或多个线程进入等待状态,直到其他线程执行完毕后,这些等待的线程才继续执行。
|
10月前
|
CountDownLatch和CyclicBarrier源码详解
我现在有个场景:现在我有50个任务,这50个任务在完成之后,才能执行下一个函数,要是你,你怎么设计?可以用JDK给我们提供的线程工具类,CountDownLatch和CyclicBarrier都可以完成这个需求。基于AQS实现,会将构造CountDownLatch的入参传递至statecountDown()就是在利用CAS将state减1,await)实际就是让头节点一直在等待state为0时,释放所有等待的线程。
82 1
|
7月前
CyclicBarrier原理
文章主要介绍了CyclicBarrier的工作原理和使用场景。CyclicBarrier适用于需要多个线程同步到达某个点后再一起继续执行的情况,它通过ReentrantLock和Condition实现了高效的线程同步机制,适合用于需要循环使用屏障点的场景。
CyclicBarrier原理
|
7月前
|
CountDownLatch、CyclicBarrier 使用区别
CountDownLatch、CyclicBarrier 使用区别
46 1
|
10月前
CountDownLatch 实战
CountDownLatch 实战
78 0
|
10月前
并发编程之CountDownLatch和CyclicBarrier的详细解析(带小案例)
并发编程之CountDownLatch和CyclicBarrier的详细解析(带小案例)
136 0
|
10月前
学习多线程之CountDownLatch使用
学习多线程之CountDownLatch使用
105 0
CountDownLatch和CyclicBarrier的区别
CountDownLatch和CyclicBarrier的区别
48 0
CyclicBarrier 和 CountDownLatch 的实现原理与代码演示
CyclicBarrier 和 CountDownLatch 的实现原理与代码演示
206 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等