Краткое резюме:
Семафор и CountDownLatch служат для различных целей.
Используйте Семафор для управления доступом потоков к ресурсу.
Используйте CountDownLatch для ожидания завершения всех потоков
Семафор определение из javadocs:
A Семафор поддерживает набор разрешений. Каждый acqu () блокирует, если необходимо, до получения разрешения , а затем берет его. Каждый release () добавляет разрешение, потенциально освобождая блокирующего эквайера.
Однако, объекты фактического разрешения не используются; Семафор просто ведет подсчет доступного числа и действует соответственно.
Как это работает?
Семафоры используются для управления количеством одновременных потоков, которые используют ресурс. Этот ресурс может быть чем-то вроде общих данных или блока кода ( критическая секция ) или любого файла.
Счетчик семафора может увеличиваться и уменьшаться, так как разные потоки вызывают acquire
() и release
(). Но в любой момент времени вы не можете иметь больше потоков, чем количество семафоров.
Семафор Варианты использования:
- Ограничение одновременного доступа к диску (это может снизить производительность из-за
ищет конкурирующий диск)
- Ограничение создания темы
- Пул соединений JDBC / ограничение
- Регулирование сетевого подключения
- Дросселирование задач с интенсивным использованием процессора или памяти
Посмотрите эту статью для использования семафора.
CountDownLatch определение из javadocs:
Средство синхронизации, позволяющее одному или нескольким потокам дождаться завершения набора операций, выполняемых в других потоках.
Как это работает?
CountDownLatch работает, если счетчик инициализируется числом потоков, которое уменьшается каждый раз, когда поток завершает свое выполнение. Когда счетчик достигает нуля, это означает, что все потоки завершили свое выполнение, и поток, ожидающий защелки, возобновил выполнение.
CountDownLatch Примеры использования:
- Достижение максимального параллелизма: иногда мы хотим начать ряд
потоки одновременно для достижения максимального параллелизма
- Ожидание завершения N потоков перед началом выполнения
- Обнаружение тупика.
Взгляните на эту статью , чтобы ясно понять концепции CountDownLatch.
Взгляните на Fork Join Pool и на эту статью . Он имеет некоторые сходства с CountDownLatch .