Doug Lea在设计并发包时已经封装好了AQS,所以在实现一些工具类的时候,只要继承AQS并重写一些方法即可
使用Demo
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {int size = 2;CountDownLatch latch = new CountDownLatch(size);for (int i = 0; i < size; i++) {new Thread(()->{try {System.out.println(Thread.currentThread().getName() + " TODO logic...");} finally {latch.countDown();}}).start();}latch.await();System.out.println("main thread end ...");}}
原理简述
- AQS内部维护一个
state值和一个阻塞队列。 - 当某个线程调用
CountDownLatch#await()方法的时候,首先会判断下state是否为0,如果不为0,进入阻塞对列,并对当前线程做LockSupport._park_(this);操作,就是阻塞该线程。 - 当某个线程调用
CountDownLatch#countdown()方法的时候,会判断下state是否为0,如果为0,协助队列中被阻塞的线程一个个出队,并一个个唤醒。
源码解读
待补充…
