背景介绍

CountDownLatch是一个同步工具类,它可以使一个线程等到其他线程执行完成后再执行。例如:main线程需要依赖线程1和线程2的执行结果,需要等待线程1和线程2都执行完成后再执行。下面代码中testCDL()方法需要等待2个线程都执行完后才会继续执行。CountDownLatch是基于AQS实现的

  1. public void testCDL() throws InterruptedException {
  2. CountDownLatch cdl = new CountDownLatch(2);
  3. new Thread(() -> {
  4. System.out.println("线程1执行");
  5. cdl.countDown();
  6. }).start();
  7. new Thread(() -> {
  8. System.out.println("线程2执行");
  9. cdl.countDown();
  10. }).start();
  11. cdl.await();
  12. System.out.println("主线程执行");
  13. }

原理

  1. 构造方法中传入的数字代表需要等待的线程数量。本质上是直接设置state的值,上述案例中将state设置为了2
  2. 当主线程执行await()方法时,就是将主线程加入到AQS的等待队列中
  3. 当一个线程执行countDown()方法的时候,是通过CAS对state变量-1
  4. 当state == 0 时,唤醒等待队列中的所有线程。即有state初始值个线程执行了countDown()操作后主线程继续执行