Reentrantlock wird intern von Sync -Klasseninstanzen implementiert.
Die Synchronisierungsklasse ist in Reentrantlock definiert.
Synchronisation wird von Abstractqueuedsynchronizer.
Abstractqueuedsynchronizer erbt von AbstractOwnsynchronizer.
In der AbstractOwnsynchronizer -Klasse wird nur eine Exklusive -Thread -Variable definiert, die den derzeit befindlichen Thread darstellt.
Zusätzlich zur Synchronisierungsklasse definiert Reentrantlock auch zwei Implementierungsklassen intern.
Nicht fairsync ist ein unfaires Schloss. Fairsync ist ein faires Schloss.
Die beiden Konstrukte von Reentrantlock sind wie folgt:
Reentrantlock -Sperrmethode
Unfaire Sperrmethode
Die Vergleichs -SetSetState -Methode ist eine CAS -Methode. Diese Methode versucht, eine Variable im Objekt zu aktualisieren. Die Variable erwartet, 0 zu sein, aktualisiert auf 1.
Wenn das Update erfolgreich ist, setzen Sie die ExclusiveWer -Thread -Variable auf den aktuellen Thread. Dann kehrt die Sperrmethode sofort zurück.
Wenn das Update fehlschlägt, wird (1) erwerben.
In der Erwerbsmethode wird Tryacquire () zuerst aufgerufen und versuchen Sie erneut zu aktualisieren.
Die Methode der TryAcquire () der unfairen Schloss lautet wie folgt:
Die nicht fairtryacquire () -Methode des unfairen Schlosses wird von der nicht fairtryacquire -Methode innen wie folgt aufgerufen:
Wenn die Methode tryAcquire () ohne Erfolg erneut vor Gericht gestellt wird. Zunächst wird die Addwaiter () -Methode aufgerufen, um den aktuellen Thread zur wartenden Warteschlange hinzuzufügen. Die Addwaiter -Methode gibt einen Knotenknoten zurück.
Nach der Rückkehr zum Knoten wird Acquirequeued (Knoten, 1) erneut versuchen, erneut zu aktualisieren.
Wenn das Update immer noch nicht aktualisiert werden kann, wird der Thread über ParkandCheckinterrupt aufgehängt.
Wiedereinschaltmethode neu eingetragen
Schauen Sie sich die Release () -Methode an.
Wenn der Kopf der Warteschlange nicht leer ist und der Wartezustand des Kopfes nicht 0 ist, wird die Methode der UnparksuSccessor () aufgerufen.
Die Methode der UnparksSuSccessor () lautet wie folgt:
Machen Sie den nächsten Knoten von hinten nach vorne, um den ersten Faden in die Warteschlange mit weniger als 0 zu erhalten. Fahren Sie dann den Faden am Knoten fort.