java并发编程cyclicbarrier和countdownlatch线程池相关

java并发编程之CountDownLatch与CyclicBa

2017-01-23  本文已影响2112人  miaoLoveCode

CountDownLatch和CyclicBarrier是jdk concurrent包下非常有用的两个并发工具类,它们提供了一种控制并发流程的手段。本文将会提供一些应用场景,结合源码,对它们的具体实现以及如何使用做一个具体分析。

CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程完成操作。

CountDownLatch使用案例

需求:解析一个文件下多个txt文件数据,可以考虑使用多线程并行解析以提高解析效率。每一个线程解析一个文件里的数据,等到所有数据解析完毕之后再进行其他操作。

设计分析:在这个需求中,需要实现主线程等待所有线程完成文件解析操作,CountDownLatch正好可以做到。

代码实现

注:只给一个简单的架子,表明CountDownLatch的具体使用方式,txt文件解析在这里就不做详细的代码实现了。

CountDownLatch使用示例
CountDownLatch源码分析

CountDownLatch是自定义AQS同步组件,接下来就以自定义同步器Sync、countDown方法和await方法为切入点,分析CountDownLatch的具体实现。

总结:CountDownLatch实质上就是一个AQS计数器,通过AQS来实现线程的等待与唤醒。

CyclicBarrier

CyclicBarrier,让一组线程到达一个同步点后再一起继续运行,在其中任意一个线程未达到同步点,其他到达的线程均会被阻塞。

CyclicBarrier源码分析

创建CyclicBarrier后,每个线程调用await方法告诉CyclicBarrier自己已经到达同步点,然后当前线程被阻塞。接下来我们来看看await方法的具体实现。

到这里为止,CyclicBarrier的重要实现源码分析就结束了,接下来还是照样给出一个具体的使用案例,方便掌握CyclicBarrier的具体用法。

CyclicBarrier使用案例

需求:多线程计算数据,merge计算结果。

代码实现

使用案例

运行结果:

运行结果

CyclicBarrier和CountDownLatch都可以实现线程等待,那么它俩之间的区别是什么呢?

CyclicBarrier和CountDownLatch的区别

看了各种资料和书,大家一致的意见都是CountDownLatch是计数器,只能使用一次,而CyclicBarrier的计数器提供reset功能,可以多次使用。但是我不那么认为它们之间的区别仅仅就是这么简单的一点。我们来从jdk作者设计的目的来看,javadoc是这么描述它们的:

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

CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

从javadoc的描述可以得出:

对于CountDownLatch来说,重点是“一个线程(多个线程)等待”,而其他的N个线程在完成“某件事情”之后,可以终止,也可以等待。而对于CyclicBarrier,重点是多个线程,在任意一个线程没有完成,所有的线程都必须等待。

CountDownLatch是计数器,线程完成一个记录一个,只不过计数不是递增而是递减,而CyclicBarrier更像是一个阀门,需要所有线程都到达,阀门才能打开,然后继续执行。

上一篇下一篇

猜你喜欢

热点阅读