Безопасно используя CyclicBarrier.reset - PullRequest
0 голосов
/ 03 мая 2018

In CyclicBarrier.reset javadocs, упоминается следующее.

Обратите внимание, что сброс по причине поломки по другим причинам может быть затруднен; потокам необходимо выполнить повторную синхронизацию другим способом и выбрать один для выполнения сброса

Учитывая вышеизложенный намек, если я убедлюсь, что барьер не сломан с помощью метода isBroken (), безопасно ли вызывать метод reset ()?

1 Ответ

0 голосов
/ 03 мая 2018

В документации не говорится, что небезопасно для вызова reset(), даже после того, как барьер сломан.

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

Вызов его, когда барьер не сломан, сломает барьер для любых ожидающих потоков и после этого сбросит барьер.

Безопасно вызывать reset в любое время в том смысле, что это не создает несоответствия памяти или скачки данных внутри CyclicBarrier.

...