Court résumé:
Semaphore et CountDownLatch ont des objectifs différents.
Utilisez Semaphore pour contrôler l'accès des threads aux ressources.
Utilisez CountDownLatch pour attendre la fin de tous les threads
Définition de sémaphore de javadocs:
Un sémaphore maintient un ensemble de permis. Chaque acquisition () bloque si nécessaire jusqu'à ce qu'un permis soit disponible, puis le prend. Chaque version () ajoute un permis, libérant potentiellement un acquéreur bloquant.
Cependant, aucun objet de permis réel n'est utilisé; le sémaphore tient simplement un compte du nombre disponible et agit en conséquence.
Comment ça marche ?
Les sémaphores sont utilisés pour contrôler le nombre de threads simultanés qui utilisent une ressource.Cette ressource peut être quelque chose comme des données partagées ou un bloc de code ( section critique ) ou n'importe quel fichier.
Le décompte d'un sémaphore peut augmenter et diminuer lorsque différents threads appellent acquire
() et release
(). Mais à tout moment, vous ne pouvez pas avoir plus de threads supérieur au nombre de sémaphore.
Cas d'utilisation de sémaphore:
- Limitation de l'accès simultané au disque (cela peut nuire aux performances en raison de recherches de disques concurrents)
- Limitation de la création de threads
- Regroupement / limitation des connexions JDBC
- Limitation de la connexion réseau
- Throttling CPU ou tâches gourmandes en mémoire
Jetez un œil à cet article pour les utilisations de sémaphore.
CountDownLatch définition de javadocs:
Aide à la synchronisation qui permet à un ou plusieurs threads d'attendre la fin d'un ensemble d'opérations en cours d'exécution dans d'autres threads.
Comment ça marche?
CountDownLatch fonctionne en ayant un compteur initialisé avec le nombre de threads, qui est décrémenté chaque fois qu'un thread termine son exécution. Lorsque le nombre atteint zéro, cela signifie que tous les threads ont terminé leur exécution et que les threads en attente de verrouillage reprennent l'exécution.
CountDownLatch Cas d'utilisation:
- Atteindre un parallélisme maximal: Parfois, nous voulons démarrer un certain nombre de threads en même temps pour obtenir un parallélisme maximal
- Attendre la fin de N threads avant de démarrer l'exécution
- Détection de blocage.
Consultez cet article pour comprendre clairement les concepts de CountDownLatch.
Jetez également un œil à Fork Join Pool dans cet article . Il présente quelques similitudes avec CountDownLatch .