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