Alle praktischen Beispiel LockSupport & AbstractQueuedSynchronizer verwenden?
Jungs, kann jemand geben ein einfaches Beispiel aus der Praxis LockSupport
& AbstractQueuedSynchronizer
verwenden? Beispiel in javadocs ist ziemlich angespannt.
Nutzung von Semaphore
erlaubt ist verstanden von mir.
Vielen Dank für jede Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du reden über das verwenden einen locking-Mechanismus (oder sogar sync-Barrieren) nur mit einem
java.util.concurrent.Lock
. Der offensichtliche Vorschlag ist, dass Benutzer einReentrantLock
die Delegierten zu einemSynch
. Die Synchronisierung wird ein AQS, die wiederum verwendetLockSupport
.Seine ganze geschieht unter der Bettdecke für Sie.
Edit:
Kein lasst uns über die praktischen Anwendungen des
AbstractQueuedSynchronizer
(AQS).Parallelität konstruiert, obwohl sehr unterschiedlich in Ihrer Nutzung alle können die gleichen zugrunde liegenden Funktionen.
I. e. Unter einer Bedingung-park in diesem thread. Unter einigen anderen Bedingungen, die wecken einen thread auf.
Dies ist eine sehr Breite Reihe von Anweisungen, sondern macht es offensichtlich, dass die meisten concurrency-Strukturen müssten einige Allgemeine Funktionen, die in der Lage wäre zu verarbeiten, diese Operationen für Sie. Geben Sie AQS. Es gibt fünf große Barrieren-Synchronisation.
ReentrantLock
ReadLock
WriteLock
Semaphore
CountDownLatch
Nun, alle diese fünf Strukturen haben sehr unterschiedliche Regeln, wenn mit Ihnen. Ein
CountdownLatch
können zulassen, dass viele threads gleichzeitig ausgeführt werden, sondern Kräfte ein (oder mehrere) threads zu warten, bis mindestens n-Anzahl der threads, die count-down auf, sagte Klinke.ReentrantLock
Kräfte nur ein thread gleichzeitig betreten eines kritischen Abschnitts und Warteschlangen, bis alle anderen threads warten, bis es abgeschlossen ist.ReadLock
kann eine beliebige Anzahl von lese-threads in den kritischen Abschnitt, bis ein write-lock ist acquiered.Die Beispiele gehen können, aber das große Bild ist, dass Sie alle AQS verwenden. Dies ist, weil Sie in der Lage sind, die Verwendung der primitiven Funktionen, die AQS bietet und realisiert komplexere Funktionalität oben drauf. AQS ermöglicht Ihnen das Parken entparken von anrufen und aufwecken von threads ( interruptibly wenn es sein muss) sondern in der Weise, dass man viele komplexe Funktionen.
AbstractQueuedLongSynchronizer
, schlagen Sie vor, es ist eine Art von internen API-Klasse? Wollte nur sehen, jede illustrative Stück code für die...AbstractQueuedSynchronizer
erscheint vage für mich.Sie sind nicht gedacht für den direkten Einsatz im client-code; mehr für das helfen Sie bauen neue concurrent-Klassen.
AQS ist eine wunderbare Klasse für Gebäude Parallelität primitive – aber es ist Komplex und erfordert ein bisschen studieren, um es richtig zu nutzen. Ich benutzte es für ein paar Dinge wie lazy Initialisierung und eine einfache, schnelle wiederverwendbare Verriegelung.
So Komplex wie es ist, ich glaube nicht, dass die AQS ist besonders vage, es hat eine ausgezeichnete javadocs zu beschreiben, wie Sie es richtig verwenden.
Release 2.7 der Disruptor verwendet LockSupport.parkNanos statt Thread.den Schlaf zu reduzieren Latenz:
http://code.google.com/p/disruptor/
AFAIK AbstractQueuedSynchronizer verwalten Sie die Zustandsübergänge. Das JDK nutzt es zu erweitern, Sync, eine interne Klasse für java.util.gleichzeitige.FutureTask. Die Sync-Klasse verwaltet die Zustände (BEREIT, LÄUFT, LIEF, und STORNIERT) von FutureTask und die übergänge zwischen Ihnen.
Dies ermöglicht, wie Sie vielleicht wissen, FutureTask zu blockieren, auf FutureTask.get (), bis das LIEF ein Zustand erreicht ist, zum Beispiel.