背景
* Java1.5引入,随之一起引入的还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。
适用场景
CountDownLatch可以等待多个线程执行完逻辑再执行后续代码。
执行结果如下所示:
awit方法就像是一堵只有所有线程的都到达才能通过的大门,缺一不可。
源码解读:
1、Sync(私有常量类)
如果说Sync是CountDownlatch的基本,AbstractQueuedSynchronizer就是基本中的基本。
AbstractQueuedSynchronizer(简称:AQS),AQS内部维护三个东西:
1、一个volatile修饰的int型变量state,用来保证锁的可重入性。
2、一个是由AQS类维护的CLH队列(用来保存等待获取锁的对象)
3、一个是由AQS的内部类ConditionObject维护的Condition队列(用来保障线程之间的等待通信)
AQS有两种获取锁的方式:独占(公平锁)和共享(非公平锁)
AQS不是本篇文章介绍的内容,需要放到下次再来讲!!
2、初始化
初始化AQS中的state值
3、countDown
将state原子性减一操作
4、await、await(long timeout, TimeUnit unit)
等待state值降为0,线程等待
CountDownLatch和CyclicBarrier区别
1、countDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次
2、CyclicBarrier的计数器更像一个阀门,需要所有线程都到达,然后继续执行,计数器递增,提供reset功能,可以多次使用