2013-02-15 8 views
5

Ich bin auf Semaphoren in Java und las diesen Artikel http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html. Das einzige, was ich nicht verstehe, ist, warum die Methode acquire() nicht in einem synchronisierten Kontext verwendet wird. Mit Blick auf das Beispiel aus dem oben Webiste:Warum muss die Methode acquire() in Semaphoren nicht synchronisiert werden?

Sie schaffen eine Semaphore:

private Semaphore semaphore = new Semaphore(100); 

und eine Genehmigung wie folgt erhalten:

semaphore.acquire(); 

Nun wäre es nicht möglich, dass zwei oder mehr Threads versuchen,() gleichzeitig zu erwerben? Wenn das so wäre, würde es ein kleines Problem mit der Zählung geben.

Oder behandelt der Semaphor selbst die Synchronisation?

Antwort

3

Oder behandelt der Semaphor selbst die Synchronisation?

Ja das ist es im Grunde genommen. Semaphore sind Thread-sicher wie in the javadoc erklärt:

Speicherkonsistenz Effekte: Aktionen in einem Thread vor einem „Freigabe“ Verfahren wie release() geschieht zuvor Aktionen Aufruf nach einem erfolgreichen „acquire“ Verfahren wie acquire() in einem anderen Thread.

Die meisten Vorgänge an den Objekten im java.util.concurrent-Paket sind Thread-sicher. Weitere Details finden Sie ganz unten in der package javadoc.

3

Semaphore sollten schnell sein und daher die atomaren Parallelität Primitive aus der Unsafe Klasse, wie CAS (compare and swap).

Mit diesen Primitiven erfolgt Synchronisation auf einer viel niedrigeren Ebene und Monitore werden nicht benötigt. (Lock-freie Synchronisation).

Tatsächlich wird die Synchronisation von einer Schleife kontinuierlich mit CAS durchgeführt, bis der erwartete Wert gleich dem geschrieben/gelesen Wert ist.

0

Synchronisation wird durch AbstractQueuedSynchronizer mit CAS-Operationen

die javadoc hier

sehen garantiert
Verwandte Themen