Doug Lea在设计并发包时已经封装好了AQS,所以在实现一些工具类的时候,只要继承AQS并重写一些方法即可

使用Demo

  1. public class CountDownLatchDemo {
  2. public static void main(String[] args) throws InterruptedException {
  3. int size = 2;
  4. CountDownLatch latch = new CountDownLatch(size);
  5. for (int i = 0; i < size; i++) {
  6. new Thread(()->{
  7. try {
  8. System.out.println(Thread.currentThread().getName() + " TODO logic...");
  9. } finally {
  10. latch.countDown();
  11. }
  12. }).start();
  13. }
  14. latch.await();
  15. System.out.println("main thread end ...");
  16. }
  17. }

原理简述

  1. AQS内部维护一个state值和一个阻塞队列
  2. 当某个线程调用CountDownLatch#await()方法的时候,首先会判断下state是否为0,如果不为0,进入阻塞对列,并对当前线程做LockSupport._park_(this);操作,就是阻塞该线程。
  3. 当某个线程调用CountDownLatch#countdown()方法的时候,会判断下state是否为0,如果为0,协助队列中被阻塞的线程一个个出队,并一个个唤醒。

源码解读

待补充…