Java 并发:倒计时闩锁与循环屏障

我正在阅读java.util.concurrent API,发现

  • CountDownLatch:一种同步辅助工具,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
  • CyclicBarrier:一种同步辅助工具,它允许一组线程全部等待彼此到达公共障碍点。

对我来说,两者似乎是平等的,但我相信还有更多的东西。

例如,在 .CoundownLatch, the countdown value could not be reset, that can happen in the case of CyclicBarrier

两者之间还有其他区别吗?
有人想要重置倒计时值的地方是什么?use cases


答案 1

还有另一个区别。

使用 时,假设您指定触发屏障的等待线程数。如果指定 5,则必须至少有 5 个线程才能调用 。CyclicBarrierawait()

使用 时,请指定对该调用的次数,这将导致释放所有等待线程。这意味着您可以只对单个线程使用 。CountDownLatchcountDown()CountDownLatch

“你为什么要那样做?”你可能会说。想象一下,您正在使用由其他人编码的神秘API来执行回调。您希望其中一个线程等待某个回调被多次调用。您不知道将在哪些线程上调用回调。在这种情况下,a是完美的,而我想不出任何方法可以使用a来实现它(实际上,我可以,但它涉及超时......哎呀!CountDownLatchCyclicBarrier

我只是希望可以重置!CountDownLatch


答案 2

一个主要区别是CyclicBarrier采用(可选的)可运行任务,该任务在满足常见障碍条件后运行。

它还允许您获取在障碍物处等待的客户端数量以及触发障碍所需的数量。一旦触发,屏障就会重置,可以再次使用。

对于简单的用例 - 服务启动等...a 倒计时闩锁很好。循环巴里尔对于更复杂的协调任务很有用。这样的事情的一个例子是并行计算 - 其中多个子任务涉及计算 - 有点像MapReduce


推荐