何时在java多线程中重置CyclicBarrier

Ana*_*and 9 java concurrency multithreading java.util.concurrent cyclicbarrier

我正在阅读CyclicBarrier以下链接 http://java-latte.blogspot.in/2013/10/cyclicbarrier-in-java-concurrency.html.

在示例1中,CyclicRaceDemo.javamain方法,CyclicBarrier正在重用而不调用reset方法.

我运行了这个例子,它运行良好.所以,我想知道reset方法的用途是什么.应该什么时候打电话?或者我们需要打电话吗?

Bor*_*der 14

A CyclicBarrier是循环的,因为它可以在不重置的情况下重复使用.来自Javadoc

一种同步辅助工具,允许一组线程全部等待彼此到达公共障碍点.CyclicBarriers在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此.屏障称为循环,因为它可以在等待线程释放后重新使用.

因此,在正常使用中,一旦收集了所有线程并且屏障被破坏,它就会自行重置并可以再次使用.

来自Javadoc forreset()

将屏障重置为其初始状态.如果任何一方当前正在等待屏障,他们将返回一个 BrokenBarrierException.注意,由于其他原因发生破损后重置可能很复杂; 线程需要以其他方式重新同步,并选择一个来执行重置.可能优选的是为随后的使用创建新的屏障.

因此reset导致任何当前正在等待的线程BrokenBarrierException立即抛出并唤醒.reset当你想"打破"障碍时使用.

还要注意警告 - 一旦线程被强行唤醒,再次同步它们就很棘手了.

TL; DR:reset()在正常情况下你永远不需要使用.