Когда нужно сбросить CyclicBarrier в многопоточности Java

Я читал CyclicBarrier по следующей ссылке http://java-latte.blogspot.in/2013/10/cyclicbarrier-in-java-concurrency.html.

В примере 1 CyclicRaceDemo.java основной метод, CyclicBarrier используется повторно без вызова метода сброса.

Я запустил пример, и он работал нормально. Итак, мне интересно, какая польза от reset метод. Когда это должно быть названо? Или нам вообще нужно это назвать?

1 ответ

Решение

CyclicBarrier является циклическим, потому что его можно использовать повторно без сброса. От Javadoc

Средство синхронизации, которое позволяет всем потокам ожидать друг друга, чтобы достичь общей барьерной точки. CyclicBarriers полезны в программах, включающих группу потоков фиксированного размера, которые иногда должны ждать друг друга. Барьер называется циклическим, потому что его можно использовать повторно после освобождения ожидающих потоков.

Таким образом, при обычном использовании, когда все потоки собраны и барьер, который он преодолел, он сбрасывается и может использоваться снова.

От Javadoc дляreset()

Сбрасывает барьер в исходное состояние. Если какие-либо стороны в настоящее время ждут у барьера, они вернутся с BrokenBarrierException, Обратите внимание, что сброс после поломки по другим причинам может быть затруднен для выполнения; потоки должны повторно синхронизироваться другим способом и выбрать один для выполнения сброса. Может быть предпочтительнее вместо этого создать новый барьер для последующего использования.

Так reset вызывает любые в настоящее время ожидающие потоки, чтобы бросить BrokenBarrierException и сразу же просыпайся. reset используется, когда вы хотите "сломать" барьер.

Обратите внимание также на предостережение - после того, как потоки были вызваны принудительно, сложно снова синхронизировать их.

TL; DR: вам никогда не нужно использовать reset() в нормальных условиях.

Другие вопросы по тегам