源码分析-CountDownLatch

Posted 千念飞羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码分析-CountDownLatch相关的知识,希望对你有一定的参考价值。

CountDownLatch

基本用法

CountDownLatch会接受一个初始化的int值count,通过调用await方法阻塞当前线程。通过其他线程调用countDown来降低当前状态值,当当前状态将至0 时,所有阻塞在CountDownLatch的线程都会立刻从await返回。

CountDownLatch时一次性的,不可以重置,如果需要重置请使用CyclicBarrier。

实现

实现比较简单。就是abstractQueuedSynchronizer基础上的实现。

首先在CountDownLatch内有一个Sync的内部静态子类,继承自AQS。

这里主要是重写了tryAcquireShared和tryReleaseShared两个共享锁。以及一个带参数的构造器构造器用来初始化count数字。

    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) //当当前状态为0是可以获得一个共享锁。
            return (getState() == 0) ? 1 : -1;
        

        protected boolean tryReleaseShared(int releases) //只要当前线程不是0则循环尝试cas降低state直至成功为止。
            // 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;
            
        
    

每个CountDownLatch包含一个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的主要内容,如果未能解决你的问题,请参考以下文章

CountDownLatch源码分析

JUC包中的CountDownLatch源码实现分析

AQS源码探究_07 CountDownLatch源码分析

AQS源码探究_07 CountDownLatch源码分析

JDK源码分析深入源码分析CountDownLatch

CountDownLatch源码分析