Чем 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки