在CyclicBarrier.reset javadocs中,提到了以下内容。
请注意,由于其他原因发生破损后的复位操作可能会很复杂。线程需要以其他方式重新同步,然后选择一种执行重置
考虑到以上提示,如果我确定通过使用isBroken()方法没有打破障碍,那么调用reset()方法是否安全?
最佳答案
即使障碍被打破,文档也没有说调用reset()
是不安全的。
只是说这很复杂,因为您需要确保只有一个线程将其重置。如果有多个线程将其重置,则线程有机会再次在屏障上等待,而第二个或第三个线程将其重置,并再次打破它(尽管在打破屏障之后,它将再次重置它,因此不在之后是isBroken()
状态)。并且,如果只有一个线程调用reset,而其他线程不等待它,则其他线程可能会在重置之前再次开始等待屏障,并立即获得BrokenBarrierException。
在没有破坏屏障的情况下调用它会破坏所有等待线程的屏障,然后重置屏障。
可以随时调用reset
,因为它不会在CyclicBarrier内部造成内存不一致或数据争夺的情况,因此是安全的。
关于java - 安全地使用CyclicBarrier.reset,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50146176/