CountDownLatch

1、CountDownLatch是一个线程同步类,位于java.util.concurrent包中。

工作方式:CountDownLatch通过计数器来实现的,计数器的初始值为线程的数量,每当一个线程执行完,计数器就减1,当计数器为0时,调用了await()处于等待的线程就恢复执行任务。

实现原理:让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果。

通过内部类Sys继承AbstractQueuedSynchronizer实现

构造方法、await()、countDown、await(long time, TimeUnit unit)。

线程要对异常进行处理。

有哪些典型的应用。

CountDownLatch是不可逆的,即不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一旦计数器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法,也就是只能创建CountDownLatch对象,并使其内部值减少,不能重新修改或增加内部值。当计数器到达0时, 全部调用 await() 方法将会立刻返回,后面再调用此CountDownLatch对象的countDown() 方法都将不会产生任何作用。后续会介绍CyclicBarriar,它除了可以实现CountDownLatch的功能外,还可以重新进行初始化,重复使用。 

部分源码:

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;
            }
        }
    }

    private final Sync sync;


    public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }
原文地址:https://www.cnblogs.com/xhongqing/p/13920157.html