Как устроен CountDownLatch? синхронизатор из Java concurrency создаётся с начальным счётчиком метод await() приостанавливает поток, пока счётчик не станет равен 0 метод countDown() уменьшает значение счётчика на 1 после достижения нуля все ожидающие потоки продолжают выполнение подходит для ожидания завершения группы потоков помогает согласованно запускать задачи или дожидаться их завершения
Как устроен CountDownLatch и когда он разблокирует потоки?
Как устроен CountDownLatch? синхронизатор из Java concurrency создаётся с начальным счётчиком метод await() приостанавливает поток, пока счётчик не станет равен 0 метод countDown() уменьшает значение счётчика на 1…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Как устроен CountDownLatch?
- синхронизатор из Java concurrency
- создаётся с начальным счётчиком
- метод await() приостанавливает поток, пока счётчик не станет равен 0
- метод countDown() уменьшает значение счётчика на 1
- после достижения нуля все ожидающие потоки продолжают выполнение
- подходит для ожидания завершения группы потоков
- помогает согласованно запускать задачи или дожидаться их завершения
Подробный ответ
Основной ответ
CountDownLatch — синхронизатор из пакета java.util.concurrent, с помощью которого один или несколько потоков могут дождаться завершения заданного числа операций, выполняемых в других потоках. Поток блокируется до тех пор, пока счётчик не уменьшится до нуля. После этого все ожидающие потоки возобновляют работу.
Ключевые моменты
- При инициализации задаётся число — счётчик событий или операций, которые должны завершиться до продолжения работы.
- Поток вызывает метод
await()и приостанавливается, если счётчик ещё не равен нулю, ожидая его уменьшения. - После выполнения задачи другие потоки вызывают
countDown(), уменьшая счётчик на единицу. - Как только значение счётчика становится равным нулю, все заблокированные потоки автоматически разблокируются.
- В отличие от CyclicBarrier, CountDownLatch является одноразовым синхронизатором и повторно запущен быть не может.
Практический контекст
CountDownLatch часто применяют, когда нужно дождаться завершения нескольких потоков — например, параллельной загрузки данных и последующей синхронизации результата. Его также используют для одновременного запуска потоков после завершения подготовки, то есть как стартовый барьер. В проектах на Java 8+ это простой и удобный механизм координации параллельных задач с гарантией их завершения.