在CyclicBarrier.reset javadocs 中,提到了以下内容。
请注意,由于其他原因发生破损后的重置可能会很复杂;线程需要以其他方式重新同步,并选择一个执行重置
考虑到上面的提示,如果我使用 isBroken() 方法确保屏障没有被破坏,那么调用 reset() 方法是否安全?
在CyclicBarrier.reset javadocs 中,提到了以下内容。
请注意,由于其他原因发生破损后的重置可能会很复杂;线程需要以其他方式重新同步,并选择一个执行重置
考虑到上面的提示,如果我使用 isBroken() 方法确保屏障没有被破坏,那么调用 reset() 方法是否安全?
文档并没有说call是不安全reset()
的,即使在障碍被打破之后也是如此。
它只是说它很复杂,因为您需要确保只有一个线程重置它。如果多个线程重置它,那么有可能线程再次等待屏障,而第二个或第三个线程重置它,再次打破它(虽然,在打破屏障后,它会再次重置它,所以它不在之后的isBroken()
状态)。如果只有一个线程调用了reset,而其他线程没有等待,那么其他线程可能会在barrier被reset之前再次开始等待,并且会立即得到BrokenBarrierException。
当屏障没有被打破时调用它,将打破任何等待线程的屏障,然后重置屏障。
任何时候调用都是安全reset
的,因为它不会在 CyclicBarrier 内造成内存不一致或数据竞争。