Что проверяет вопрос про CyclicBarrier

Вопрос звучит просто: «расскажите про CyclicBarrier». На деле проверяют, понимаете ли вы разницу между разовой синхронизацией и повторяемой точкой встречи потоков — и не путаете ли барьер с CountDownLatch.

CountDownLatch — счётчик, который считает вниз и не сбрасывается. Один поток может дёргать countDown(), другие висят на await(). После нуля объект бесполезен, нужен новый.

CyclicBarrier устроен иначе: все N потоков, которые должны встретиться, сами вызывают await(). Когда собрались все — барьер срабатывает и автоматически сбрасывается для следующего раунда. Отсюда и название — cyclic.

CyclicBarrier barrier = new CyclicBarrier(3, () -> { System.out.println("round done"); });

for (int i = 0; i < 3; i++) { new Thread(() -> { doWork(); try { barrier.await(); } catch (Exception e) { Thread.currentThread().interrupt(); } }).start(); }

Второй аргумент конструктора — Runnable, который выполнится один раз, когда последний поток дойдёт до барьера, до того как все продолжат работу. Удобно для агрегации результатов раунда.

Спросят следом: что будет с барьером, если один из потоков упадёт с исключением внутри await() или не дойдёт до него по таймауту. Ответ: барьер переходит в broken state, все остальные потоки, ждущие на await(), получат BrokenBarrierException. Барьер в этом состоянии нельзя использовать повторно без явного reset().

CountDownLatch — для события «подождать N штук один раз». CyclicBarrier — для «синхронизировать N потоков на каждой итерации цикла».

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки