Reentrantlock est implémenté en interne par des instances de classe Sync.
La classe de synchronisation est définie à l'intérieur de ReentrantLock.
Sync hérite de l'abstractqueueEdSynchronizer.
AbstractqueEuedSynchronizer hérite de AbstractownablesSynchronizer.
Seule une variable exclusiveOwnerThread est définie dans la classe AbstractownableSynchronizer, représentant le fil actuellement détenu.
En plus de la classe Sync, ReentrantLock définit également deux classes d'implémentation en interne.
NonfairSync est une serrure injuste. FairSync est une clôture équitable.
Les deux constructions de reentrantlock sont les suivantes:
Méthode de verrouillage ReentrantLock
Méthode de verrouillage déloyal
La méthode comparendSetState est une méthode CAS. Cette méthode tente de mettre à jour une variable dans l'objet. La variable prévoit d'être 0, mise à jour à 1.
Si la mise à jour est réussie, définissez la variable ExclusiveownerThread au thread actuel. Ensuite, la méthode de verrouillage reviendra immédiatement.
Si la mise à jour échoue, acquérir (1) est appelé.
Dans la méthode Acquire, TryAcQuire () est appelé d'abord et essaie de mettre à jour.
La méthode TryAcquire () de verrouillage déloyal est la suivante:
La méthode non fairtryacquire () de la verrouillage déloyal est appelée en interne par la méthode non fairtryacquire comme suit:
Si la méthode TryAcQuire () est réessayée sans succès. Tout d'abord, la méthode AddWaitter () sera appelée pour ajouter le thread actuel à la file d'attente d'attente. La méthode AddWaitter renvoie un nœud de nœud.
Après le retour au nœud, AcquireEued (nœud, 1) essaiera de mettre à jour à nouveau.
Si la mise à jour ne peut toujours pas être mise à jour, le fil sera suspendu via ParkandCheckInterrupt.
Méthode de déverrouillage de RentrantLock
Consultez la méthode Release ().
Si la tête de la file d'attente n'est pas vide et que l'état d'attente de la tête n'est pas 0, la méthode UnparkSuccessor () est appelée.
La méthode UnparkSuccessor () est la suivante:
Faites le prochain Node Traverse de l'arrière vers l'avant pour obtenir le premier fil dans la file d'attente avec Waitstatus inférieur à 0. Ensuite, continuez le fil sur le nœud.