Короткий зміст:
Semaphore і CountDownLatch виконують різні цілі.
Використовуйте Semaphore для контролю доступу потоку до ресурсу.
Використовуйте CountDownLatch, щоб дочекатися завершення всіх потоків
Семафор визначення з Javadocs:
Семафор підтримує набір дозволів. Кожне з набору блоків () блокує, якщо це необхідно, до тих пір, поки не з’явиться дозвіл , а потім бере його. Кожен випуск () додає дозвіл, потенційно звільняючи блокуючого набувача.
Однак фактичні об'єкти дозволу не використовуються; Семафор просто продовжує підрахунок числа наявних і діє відповідним чином .
Як це працює ?
Семафори використовуються для контролю кількості паралельних потоків, які використовують ресурс. Цей ресурс може бути чимось на зразок спільних даних або блоком коду ( критичний розділ ) або будь-яким файлом.
Відлік на семафорі може зростати і зменшуватися, коли різні потоки викликають acquire
() та release
(). Але в будь-який момент часу ви не можете мати більшу кількість потоків, більшу за кількість семафорів.
Приклади використання семафору:
- Обмеження одночасного доступу до диска (це може призвести до зниження продуктивності через конкуруючі пошуки диска)
- Обмеження створення ниток
- Пул / обмеження з'єднання JDBC
- Мережеве підключення
- Зниження центрального процесора або завдань із великою пам’яттю
Погляньте на цю статтю щодо використання семафору.
Визначення CountDownLatch із javadocs:
Допомога синхронізації, яка дозволяє одному або декільком потокам чекати, поки завершиться набір операцій, що виконуються в інших потоках.
Як це працює?
CountDownLatch працює за допомогою ініціалізації лічильника з кількістю потоків, який зменшується кожного разу, коли потік завершує своє виконання. Коли рахунок доходить до нуля, це означає, що всі потоки завершили своє виконання, і потік, що очікує на засувці, продовжує виконання.
CountDownLatch Варіанти використання:
- Досягнення максимального паралелізму: Іноді ми хочемо запустити кілька потоків одночасно, щоб досягти максимального паралелізму
- Дочекайтеся завершення N потоків перед початком виконання
- Виявлення тупикової ситуації.
Погляньте на цю статтю, щоб чітко зрозуміти концепції CountDownLatch.
Погляньте також на Fork Join Pool у цій статті . Він має деяку схожість із CountDownLatch .