美文网首页multiThread
java多线程并发编程之CountDownLatch

java多线程并发编程之CountDownLatch

作者: 但时间也偷换概念 | 来源:发表于2018-07-01 18:59 被阅读76次

CountDownLatch简介

官方标注:

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

CountDownLatch是java.util.concurrent包中的并发组件。

CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行,相当于1.5时代的Thread.join()。在1.6时代之后,推出了juc包,提供了线程池以及并发组件等api,join操作现在很少调用,所以在多线程调度中,CountDownLatch使用还是比较频繁的,合理的运用CountDownLatch以及线程池调度,能够显著的提高系统性能,并行处理任务。

CountDownLatch使用方式

举个栗子:

CountDownLatch-V1

如上图:博主开启了五个线程去调度,以Thread.sleep来模拟真实的耗时操作。

最后在主线程join子线程结束,以打印顺序来论证CountDownLatch的作用。

CountDownLatch-V2

如上图:当博主将await最大等待时间调整为1000毫秒,这个时间小于子线程task执行时长,运行结果可以看到,主线程没有等待所有线程执行完毕再执行44行代码,这个就是CountDownLatch的await方法传入最大等待时长的结果,在某些场景,可以用这个方式去控制阻塞时间。

CountDownLatch源码解析

CountDownLatch源码

如图:可以看到CountDownLatch底层是AQS

/**

* Synchronization control For CountDownLatch.

* Uses AQS state to represent count.

*/

AbstractQueuedSynchronizer,队列同步器,简称AQS,它是java并发用来构建锁或者其他同步组件的基础框架。

关于AQS博主打算另开一篇博文介绍,这里就简单带过。

在CountDownLatch的源码设计里,是利用AQS做了一个标志位设计,开发了Sync静态内部类去继承AbstractQueuedSynchronizer,模版设计模式。在构造方法里设置好volatile变量state。

CountDownLatch源码

如上图: CountDownLatch利用AQS的state,在构造进行了初始化state设置。之后的await方法也是利用AQS自旋等待。

CountDownLatch源码

如上图: countDown方法更简单,就是把标志位的state count-1.

AbstractQueuedSynchronizer源码

那么看到这里就很清楚了,CountDownLatch完全是建立在AQS基础上,利用state做了一层CAS。只要await的时候,标志位没有到达0,也就是getState()!=0,就会不断自旋,以此达到高效控制批量线程的作用。

相关文章

网友评论

    本文标题:java多线程并发编程之CountDownLatch

    本文链接:https://www.haomeiwen.com/subject/mzicuftx.html