Kurze Zusammenfassung:
Semaphore und CountDownLatch dienen unterschiedlichen Zwecken.
Verwenden Sie Semaphore , um den Thread-Zugriff auf Ressourcen zu steuern.
Verwenden Sie CountDownLatch , um auf den Abschluss aller Threads zu warten
Semaphordefinition aus Javadocs:
Ein Semaphor verwaltet eine Reihe von Genehmigungen. Jeder Erwerb () blockiert bei Bedarf, bis eine Genehmigung verfügbar ist, und nimmt sie dann entgegen. Mit jeder Version () wird eine Genehmigung hinzugefügt, die möglicherweise einen blockierenden Acquirer freigibt.
Es werden jedoch keine tatsächlichen Genehmigungsobjekte verwendet. Das Semaphor zählt nur die verfügbare Anzahl und handelt entsprechend.
Wie funktioniert es ?
Semaphoren werden verwendet, um die Anzahl der gleichzeitigen Threads zu steuern, die eine Ressource verwenden. Diese Ressource kann so etwas wie freigegebene Daten oder ein Codeblock ( kritischer Abschnitt ) oder eine beliebige Datei sein.
Die Anzahl auf einem Semaphor kann steigen und fallen, wenn verschiedene Threads acquire
() und release
() aufrufen . Zu jedem Zeitpunkt können Sie jedoch nicht mehr Threads als die Anzahl der Semaphore haben.
Anwendungsfälle für Semaphore:
- Einschränken des gleichzeitigen Zugriffs auf die Festplatte (dies kann die Leistung aufgrund konkurrierender Festplattensuchen beeinträchtigen)
- Einschränkung der Thread-Erstellung
- JDBC-Verbindungspooling / -begrenzung
- Drosselung der Netzwerkverbindung
- CPU- oder speicherintensive Aufgaben drosseln
Schauen Sie sich diesen Artikel für Semaphor-Anwendungen an.
CountDownLatch- Definition aus Javadocs:
Eine Synchronisationshilfe, mit der ein oder mehrere Threads warten können, bis eine Reihe von Vorgängen in anderen Threads abgeschlossen ist.
Wie funktioniert es?
CountDownLatch funktioniert, indem ein Zähler mit der Anzahl der Threads initialisiert wird, der jedes Mal dekrementiert wird, wenn ein Thread seine Ausführung abschließt. Wenn die Anzahl Null erreicht, bedeutet dies, dass alle Threads ihre Ausführung abgeschlossen haben und der auf den Latch wartende Thread die Ausführung fortsetzt.
CountDownLatch Anwendungsfälle:
- Maximale Parallelität erreichen: Manchmal möchten wir mehrere Threads gleichzeitig starten, um maximale Parallelität zu erreichen
- Warten Sie, bis N Threads abgeschlossen sind, bevor Sie mit der Ausführung beginnen
- Deadlock-Erkennung.
Schauen Sie sich diesen Artikel an, um die CountDownLatch-Konzepte klar zu verstehen.
Schauen Sie sich auch Fork Join Pool in diesem Artikel an . Es hat einige Ähnlichkeiten mit CountDownLatch .