Пример разрушения барьера
Я читаю книгу " Параллелизм Java на практике", где говорится:
CyclicBarrier
позволяет фиксированному количеству сторон неоднократно встречаться в барьерной точке и полезен в параллельных итерационных алгоритмах, которые разбивают задачу на фиксированное количество независимых подзадач.
Может кто-нибудь привести пример того, как проблема разбивается на несколько независимых подзадач?
3 ответа
Вы должны разбить проблему на несколько независимых подзадач самостоятельно.
Барьеры гарантируют, что каждая сторона выполнит первую подзадачу до того, как какая-либо из них начнется во второй подзадаче. Это гарантирует, что все данные из первой подзадачи будут доступны до запуска второй подзадачи.
CyclicBarrier специально используется, когда один и тот же барьер необходим снова и снова, когда каждый шаг фактически идентичен. Например, это может произойти при выполнении любого вида многопоточного моделирования реальности, которое выполняется поэтапно. CyclicBarrier гарантирует, что каждый поток завершил данный шаг, прежде чем все потоки начнут следующий шаг.
Есть еще одно важное различие между CountDownLatch
а также CyclicBarrier
и это: поток синхронизирован на CountDownLatch
не может указать другим потокам, что с ним что-то не так, поэтому у других потоков может быть выбор - продолжить ли вы прерывание всей совместной операции.
В случае CycliBarrier
пока один из потоков ожидает await()
какой-то другой поток прерывается или время ожидания истекло, затем BrokenBarrierException
произойдет в текущем потоке, указывая, что что-то пошло не так в одном из взаимодействующих потоков.
BrokenBarrierException
также произойдет в других обстоятельствах, которые вы можете найти в Javadoc на await()
метод.
Из-из-коробки, CountDownLatch
не предлагает эту функцию.
Если у вас есть алгоритм, который можно разбить на независимые подзадачи,
ТОГДА CyclicBarrier полезен для всех ваших потоков, чтобы встретиться в конце их вычисления и, например, объединить их результаты.
Обратите внимание, что платформа Fork/Join, представленная в Java 7, позволяет вам делать нечто подобное без необходимости использовать CyclicBarrier.