安全地使用CyclicBarrier.reset

时间:2018-05-03 02:45:15

标签: java multithreading java.util.concurrent cyclicbarrier

CyclicBarrier.reset javadocs中,提到了以下内容。

  

请注意,由于其他原因发生破损后重置可能会很复杂;线程需要以其他方式重新同步,并选择一个执行重置

考虑到上面的提示,如果我确保使用isBroken()方法不会破坏屏障,调用reset()方法是否安全?

1 个答案:

答案 0 :(得分:0)

即使屏障被破坏,文档也没有说它是不安全的来调用reset()

它只是说它很复杂,因为你需要确保只有一个线程重置它。如果多个线程重置它,那么线程有可能再次在屏障上等待,而第二个或第三个线程重置它,再次打破它(虽然,在打破障碍后,它将再次重置它,所以它不在之后的isBroken()州。如果只有一个线程调用reset,但其他线程没有等待它,那么其他线程可能会在重置之前再次开始等待屏障,并且会立即得到BrokenBarrierException。

当屏障未被打破时调用它,将打破任何等待线程的屏障,然后重置屏障。

可以随时调用reset,因为它不会在CyclicBarrier中产生内存不一致或数据争用。

相关问题