Когда нужно сбросить 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()
в нормальных условиях.