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