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