CountDownLatch和CyclicBarrier比较

CountDownLatch和CyclicBarrier比较

这两个类有着很多相似的地方,有些需求他俩都能够解决,但是从底层实现上来看,两者有着很大的不同。通过下面的图表来看下这两个类有哪些不一样的地方。

CountDownLatch CyclicBarrier
等待各个线程全部计算到某个点之后再进行最终操作。体现的是线程的主次之分,其他线程计算之后,主线程再计算。 多个线程在执行某个点之后相互等待,全部到齐后再继续执行。体现的是多个线程之间的关系,没有主次之分
计数为0时,无法重置,底层的state归零后,不会再对state重新赋值了。 计数为0时,会重置为最初设置的值,底层有两个成员变量count和parties保存计数,后者是final修饰,当count为0时,会将parties重新赋值给count。
体现的单次执行 体现的可重复多次执行
调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响 调用await()方法计数减1,若减1后的值不等于设置的值时,则线程阻塞
底层基于AQS和CAS 底层使用了ReentrantLock和Condition
适用于线程计算任务时间短的场景 适用于线程计算任务时间长的场景