在并发工具类中,我们简单了解了CountDownLatch,接下来走读下代码看看其是如何实现的,代码基于JDK1.7。
代码走读
当你打开CountDownLatch类后,你会发现这个类很简单的,其实就是基于AQS实现的共享锁。然后重写了tryAcquireShared()、tryReleaseShared()方法。AQS中定义了个模板方法,获取锁和释放锁的流程都一样,这里不再赘述,具体大家请参考AQS源码走读。
CountDownLatch其实就是对于计数器进行加减操作
CountDownLatch调用await()方法获取共享锁,当计数器为0是获取到锁,计数器初始的值通过构造方法传入。
CountDownLatch调用countDown()方法释放共享锁,计数器减1。
总结:CountDownLatch基于AQS共享锁实现,其最核心的就是其中的计数器,调用countDown()方法计数器减1,当计数器为0时等待的线程获取到锁。
例子
public class CountDownLatchDemo {
private static int LATCH_SIZE = 5;
private static CountDownLatch doneSignal;
public static void main(String[] args) {
try {
doneSignal = new CountDownLatch(LATCH_SIZE);
// 新建5个任务
for (int i = 0; i < LATCH_SIZE; i++)
new InnerThread().start();
System.out.println("main await begin.");
// "主线程"等待线程池中5个任务的完成
doneSignal.await();
System.out.println("main await finished.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class InnerThread extends Thread {
public void run() {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " sleep 1000ms.");
// 将CountDownLatch的数值减1
doneSignal.countDown();
doneSignal.await();
System.out.println("11111111111");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}