java多线程十二 闭锁CountDownLatch

时间:2022-07-20 18:12:14

CountDownLatch

CounyDownLatch是一个同步类,他允许一个或多个线程一直等待,直到其他线层的操作执行完成后再去执行。

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

工作原理

CountDownLatch实现使用一个计数器,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1.当计数器值到达0时,它表示所有的线程已经完成了任务,然后再闭锁上等待的线程就可以恢复执行任务。

构造函数

CountDownLatch类只提供了一个构造函数

public CountDownLatch(int count) {...}

上面再描述CountDownLatch的工作原理时也说过,CountDownLatch实现使用一个计数器,而参数cout就是初始化计数器的值,该值一经初始化就不能再被修改。

常用API解析

await()方法

Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted.

该方法用来式当前线程处于阻塞状态,知道闭锁中计数的值递减到0,或者线程被中断

await(long timeout, TimeUnit unit)

Causes the current thread to wait until the latch has counted down to zero, unless the thread is interrupted, or the specified waiting time elapses.

该方法同await()方法,多出的两个参数定义了等待时间,把阻塞线程恢复的条件变为了三个。计数值递减到0、线程中断、到达超时时间

countDown()方法

Decrements the count of the latch, releasing all waiting threads if the count reaches zero.

该方法用来递减闭锁中计数器的值,当值到达0时所有等待的线程将恢复执行。

getCount()方法

Returns the current count.

该方法获取当前计数器的值。

使用场景

  1. 实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松的完成测试。我们只需要顶用一次countDown()方法就可以让所有的等待线程同时恢复执行
  2. 开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。
  3. 死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁

参考:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
http://www.importnew.com/15731.html