首页 > 技术文章 > Java并发工具类-CounDownLatch

qiuzhiqiang 2020-11-17 20:46 原文

背景

  * 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功能,可以多次使用

推荐阅读