Получить доступ

Что делает CountDownLatch?

JuniorМногопоточность
Ещё спрашивают так:
  • Чем CountDownLatch отличается от CyclicBarrier и Semaphore?
  • Как дождаться завершения нескольких потоков?
Коротко

CountDownLatch — защёлка на счётчике: потоки ждут в await(), пока другие не уменьшат счётчик до нуля через countDown().

  • Применение: дождаться готовности зависимостей или завершения пачки задач
  • Одноразовая — сбросить счётчик нельзя

А ещё Не путать: Semaphore ограничивает число одновременных потоков, CyclicBarrier — взаимное ожидание группы и многоразовый

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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.

Частые ошибки

  • Пытаться переиспользовать защёлку после обнуления.
  • Путать её с семафором или барьером.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Позволяет одним потокам дождаться, пока счётчик событий не дойдёт до нуля
  • ✗Ограничивает число потоков, одновременно работающих с ресурсом
  • ✗Синхронизирует потоки, заставляя их дождаться друг друга и продолжить вместе
  • ✗Гарантирует выполнение задач в порядке их поступления

Что спросят дальше

  • Чем барьер отличается от защёлки?
  • Какой примитив ограничивает число одновременных обращений?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем