背景介绍
CountDownLatch是一个同步工具类,它可以使一个线程等到其他线程执行完成后再执行。例如:main线程需要依赖线程1和线程2的执行结果,需要等待线程1和线程2都执行完成后再执行。下面代码中testCDL()方法需要等待2个线程都执行完后才会继续执行。CountDownLatch是基于AQS实现的
public void testCDL() throws InterruptedException {CountDownLatch cdl = new CountDownLatch(2);new Thread(() -> {System.out.println("线程1执行");cdl.countDown();}).start();new Thread(() -> {System.out.println("线程2执行");cdl.countDown();}).start();cdl.await();System.out.println("主线程执行");}
原理
- 构造方法中传入的数字代表需要等待的线程数量。本质上是直接设置state的值,上述案例中将state设置为了2
- 当主线程执行await()方法时,就是将主线程加入到AQS的等待队列中
- 当一个线程执行countDown()方法的时候,是通过CAS对state变量-1
- 当state == 0 时,唤醒等待队列中的所有线程。即有state初始值个线程执行了countDown()操作后主线程继续执行
