Что делает CountDownLatch?
- Чем CountDownLatch отличается от CyclicBarrier и Semaphore?
- Как дождаться завершения нескольких потоков?
CountDownLatch — защёлка на счётчике: потоки ждут в await(), пока другие не уменьшат счётчик до нуля через countDown().
- Применение: дождаться готовности зависимостей или завершения пачки задач
- Одноразовая — сбросить счётчик нельзя
А ещё Не путать: Semaphore ограничивает число одновременных потоков, CyclicBarrier — взаимное ожидание группы и многоразовый
Подробно
CountDownLatch создаётся с начальным значением счётчика. Потоки, вызвавшие await(), блокируются. Каждый countDown() уменьшает счётчик; когда он доходит до нуля, все ожидающие продолжают работу.
Типичные применения:
- при старте сервиса дождаться, пока поднимутся все зависимости;
- запустить N задач и дождаться их завершения перед сборкой результата;
- в тестах — одновременно стартовать несколько потоков.
Ограничение — защёлка одноразовая: когда счётчик обнулился, сбросить его нельзя.
Соседние примитивы:
- CyclicBarrier — группа потоков ждёт друг друга в общей точке, затем все продолжают; барьер можно использовать повторно;
- Semaphore — ограничивает число потоков, одновременно имеющих доступ к ресурсу (не больше 10 соединений);
- Phaser — гибкий многоразовый барьер с переменным числом участников.
Для ожидания задач из пула часто удобнее invokeAll или CompletableFuture.allOf.
Пример
CountDownLatch ready = new CountDownLatch(3);
for (String service : List.of("db", "cache", "queue")) {
pool.submit(() -> { connect(service); ready.countDown(); });
}
ready.await(30, TimeUnit.SECONDS); // ждём все три подключенияЧто хотят услышать
- Механика await/countDown.
- Пример применения.
- Одноразовость.
- Отличия от CyclicBarrier и Semaphore.
Частые ошибки
- Пытаться переиспользовать защёлку после обнуления.
- Путать её с семафором или барьером.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Позволяет одним потокам дождаться, пока счётчик событий не дойдёт до нуля
- ✗Ограничивает число потоков, одновременно работающих с ресурсом
- ✗Синхронизирует потоки, заставляя их дождаться друг друга и продолжить вместе
- ✗Гарантирует выполнение задач в порядке их поступления
Что спросят дальше
- Чем барьер отличается от защёлки?
- Какой примитив ограничивает число одновременных обращений?
Разбор темы
- Координация: семафоры, защёлки и барьеры
Semaphore, CountDownLatch, CyclicBarrier, Phaser и Exchanger — что каждый делает и когда выбирать.
Связанные вопросы
- В коде вызывается semaphore.acquire(), затем работа с ресурсом, затем semaphore.release() в конце метода. Что здесь опасно? Middle
- Чем различаются CountDownLatch, CyclicBarrier и Semaphore? Middle
- Можно ли переиспользовать CountDownLatch после того, как счётчик дошёл до нуля? Middle
- Нужно ограничить число одновременных обращений к внешнему API десятью, не ограничивая при этом число рабочих потоков. Какой примитив подходит? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.