В документации не говорится, что небезопасно для вызова reset()
, даже после того, как барьер сломан.
Это просто говорит, что это сложно, потому что вам нужно убедиться, что только один поток сбрасывает его. Если несколько потоков сбрасывают его, то есть вероятность, что потоки снова ждут на барьере, в то время как второй или третий поток сбрасывает его, ломая его снова (хотя, после разрушения барьера, он снова сбрасывает его, поэтому он не состояние isBroken()
после этого). И если только один поток вызывает сброс, но другие потоки не ждут его, тогда другие потоки могут снова начать ожидать барьер, прежде чем он будет сброшен, и немедленно получат исключение BrokenBarrierException.
Вызов его, когда барьер не сломан, сломает барьер для любых ожидающих потоков и после этого сбросит барьер.
Безопасно вызывать reset
в любое время в том смысле, что это не создает несоответствия памяти или скачки данных внутри CyclicBarrier.