CountDownLatch vs. Semaphore
Ist dort jeder möglicher Vorteil der Verwendung von
java.util.gleichzeitige.CountdownLatch
statt
java.util.gleichzeitige.Semaphor?
Soweit ich sagen kann, die folgenden Fragmente sind fast äquivalent:
1. Semaphore
final Semaphore sem = new Semaphore(0);
for (int i = 0; i < num_threads; ++ i)
{
Thread t = new Thread() {
public void run()
{
try
{
doStuff();
}
finally
{
sem.release();
}
}
};
t.start();
}
sem.acquire(num_threads);
2: CountDownLatch
final CountDownLatch latch = new CountDownLatch(num_threads);
for (int i = 0; i < num_threads; ++ i)
{
Thread t = new Thread() {
public void run()
{
try
{
doStuff();
}
finally
{
latch.countDown();
}
}
};
t.start();
}
latch.await();
Außer, dass im Fall #2 die Verriegelung kann nicht wiederverwendet werden und noch wichtiger: Sie müssen im Voraus wissen, wie viele threads erstellt werden (oder warten Sie, bis Sie alle Schritte vor der Erstellung der Klinke.)
So, in welcher situation könnten die Riegel vorzuziehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
CountDown latch wird Häufig verwendet, für die das genaue Gegenteil von Ihrem Beispiel. In der Regel, Sie hätte viele threads blockiert "warten ()", die würden alle gleichzeitig zu starten, wenn der countown null erreicht.
Könnte man auch als MPI-Stil "Barriere", die bewirkt, dass alle threads auf andere threads warten zu fangen bis zu einem bestimmten Punkt, bevor Sie fortfahren.
Dass alle sagten, der CountDown latch kann sicher verwendet werden, in der Art und Weise, die Sie gezeigt haben, dass in Ihrem Beispiel.
CountDownLatch wird verwendet, um eine Reihe von threads, und dann warten, bis alle von Ihnen sind komplett (oder bis Sie rufen
countDown()
eine bestimmte Anzahl von Zeiten.Semaphor wird verwendet, um die Anzahl der gleichzeitigen threads, die mit einer Ressource. Diese Ressource kann so etwas wie eine Datei, oder könnte die cpu durch die Begrenzung der Anzahl der threads. Der Graf auf einer Semaphore kann rauf und runter gehen, da verschiedene threads rufen
acquire()
undrelease()
.In deinem Beispiel, sind Sie im wesentlichen mit Semaphore als eine Art GrafBISRiegel. Gegeben, dass Ihre Absicht ist es, warten auf alle threads-Veredelung, mit der
CountdownLatch
macht Ihre Absicht klarer.Kurze Zusammenfassung:
Semaphore und CountDownLatch dient unterschiedlichen Zwecken.
Verwenden Semaphore zu kontrollieren-thread Zugriff auf die Ressource.
Verwenden CountDownLatch zu warten, für die Fertigstellung aller threads
Semaphore definition von javadocs:
Jedoch keine eigentliche Genehmigung Objekte verwendet werden; die Semaphore hält nur eine Zählung der Anzahl zur Verfügung und agiert entsprechend.
Wie funktioniert es ?
Semaphoren werden verwendet, um die Anzahl der gleichzeitigen threads, die mit einer Ressource.Diese Ressource kann so etwas wie eine gemeinsame Daten oder einen code-block (kritischen Abschnitt) oder eine Datei.
Den Grafen auf eine Semaphore kann rauf und runter gehen, da verschiedene threads rufen
acquire
() undrelease
(). Aber an jedem Punkt der Zeit, können Sie nicht mehr die Anzahl der threads größer als Semaphore count.Semaphore Anwendungsfälle:
konkurrierende Plattenzugriffe)
Haben Sie einen Blick auf diese Artikel für semaphore verwendet.
CountDownLatch definition von javadocs:
Wie funktioniert es?
CountDownLatch funktioniert, indem ein Zähler initialisiert mit der Zahl der threads, die dekrementiert jedes mal, wenn ein thread seine Ausführung. Wenn der Zähler bei null, es bedeutet, dass alle threads beendet Ihre Ausführung, und der thread-warten auf latch-fortsetzen der Ausführung.
CountDownLatch Anwendungsfälle:
threads zur gleichen Zeit zu erreichen, die maximale Parallelität
Haben Sie einen Blick auf diese Artikel zu verstehen CountDownLatch Konzepte deutlich.
Haben Sie einen Blick auf Fork-Join-Pool an dieser Artikel zu. Es hat einige ähnlichkeiten zu CountDownLatch.
Sagen, Sie gingen in die golf-pro-shop, in der Hoffnung zu finden, ein Quartett,
Wenn Sie in der Schlange stehen um einen Abschlag von einem der pro shop Telefonzentralen, bist du im wesentlichen genannt
proshopVendorSemaphore.acquire()
, sobald man ein T-Stück Zeit, die Sie genanntproshopVendorSemaphore.release()
.Hinweis: der gratis-Telefonzentralen-service können Sie, d.h. freigegebene Ressource.Jetzt können Sie zu Fuß bis zu starter, beginnt er eine
CountDownLatch(4)
und fordertawait()
zu warten, für den anderen, für Ihren Teil, den Sie genannt wird überprüft-alsoCountDownLatch
.countDown()
und so ist der rest der Vierer-Formation. Wenn alle kommen, starter gibt go ahead(await()
rufen zurück)Nun, nach neun Löchern, wenn jeder von Ihnen eine Auszeit nehmen, um hypothetisch können beinhalten starter wieder, er verwendet eine 'neue'
CountDownLatch(4)
Abschlag Loch 10, gleichen warte - /sync als Loch 1.Jedoch, wenn die starter verwendet eine
CyclicBarrier
zu beginnen, er hätte zurückgesetzt, die gleiche Instanz in Loch 10, statt ein zweites latch, die & werfen.Blick auf die frei verfügbare Quelle, es gibt keine Magie in der Umsetzung der beiden Klassen, so dass Ihre Leistung sollte gleich sein. Wählen Sie die eins, die macht, Ihre Absicht noch deutlicher.
CountdownLatch macht threads warten auf den await () - Methode, bis zu der Zeit, als die Zählung null erreicht hat. Vielleicht möchten Sie alle Ihre threads zu warten, bis die 3 Aufrufe von etwas ist, dann werden alle threads gehen kann. Die Riegel in der Regel nicht mehr zurückgesetzt werden können.
Einer Semaphore erlaubt es threads zum abrufen von Genehmigungen, die verhindert, dass zu viele threads von der Ausführung auf einmal blockieren, wenn Sie nicht bekommen kann die Genehmigung(en) es erfordert, um fortzufahren. Genehmigungen zurückgegeben werden kann, eine Semaphor-so dass die anderen wartenden threads zu gehen.