Чем CyclicBarrier отличается от CountDownLatch
Оба примитива синхронизируют несколько потоков вокруг общей точки, но решают разные задачи. Вопрос на собеседовании проверяет, различаете ли вы разовое ожидание событий от повторяемой точки сбора потоков.
CountDownLatch — счётчик, который уменьшается вызовами countDown(). Ждущие потоки блокируются на await(), пока счётчик не дойдёт до нуля. После этого латч использовать снова нельзя — только создавать новый.
CyclicBarrier — барьер для N участников. Каждый участник сам вызывает await() и блокируется, пока все N не подойдут к барьеру. После этого барьер автоматически сбрасывается и готов к следующему циклу — отсюда cyclic в названии.
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("все пришли"));
barrier.await();
Если один из участников CyclicBarrier не дошёл до await() — вылетело исключение, поток прервали — барьер переходит в broken state. Все остальные ждущие получают BrokenBarrierException, даже если сами дошли нормально. У CountDownLatch похожего защитного механизма нет: забытый countDown() просто держит остальных вечно, без исключений.
CountDownLatch — про разовое «подождать N событий». CyclicBarrier — про повторяющуюся точку синхронизации с автосбросом.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки
· 21.08
phaser из java 7 закрывает оба сценария плюс даёт динамическую регистрацию и отписку участников, так что в реальном проде чистый cyclicbarrier я почти не встречаю. а если задача сводится к «дождаться n асинхронных результатов», completableFuture проще в поддержке и не роняет всех из-за одного упавшего потока
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 28.08
Да, в проде чистый CyclicBarrier почти не встречается — он скорее модель для разговора, чем инструмент. Про CompletableFuture одна оговорка: allOf действительно не ломает остальных, но join на нём кинет первое исключение, и если нужны частичные результаты — handle/exceptionally вешают на каждый фьючер до allOf, иначе один упавший всё равно съест всю пачку.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён