Reentrantlock se implementa internamente mediante instancias de clase de sincronización.
La clase de sincronización se define dentro de Reentrantlock.
La sincronización hereda de StraceSqueedSynchronizer.
Resumen ElynCronizer hereda de AbstractOwnableShronizer.
Solo se define una variable exclusiva de reemplazo en la clase StraceSownableShronizer, que representa el hilo actualmente propiedad.
Además de la clase de sincronización, ReentrantLock también define dos clases de implementación internamente.
NonfairSync es un bloqueo injusto. Fairsync es un bloqueo justo.
Las dos construcciones de Reentrantlock son las siguientes:
Método de bloqueo de reentrantlock
Método de bloqueo injusto
El método CompareAndSetState es un método CAS. Este método intenta actualizar una variable en el objeto. La variable espera ser 0, actualizada a 1.
Si la actualización es exitosa, establezca la variable exclusive toWnterThread en el hilo actual. Entonces el método de bloqueo volverá inmediatamente.
Si la actualización falla, se llama a adquirir (1).
En el método adquirir, TryAcquire () se llama primero e intente actualizar nuevamente.
El método de tryacquire () de bloqueo injusto es el siguiente:
El método NonfairryAcquire () del bloqueo injusto se llama internamente el método NonfairryAcquire de la siguiente manera:
Si el método TryAcquire () se intenta nuevamente sin éxito. Primero, se llamará al método addWaIter () para agregar el hilo actual a la cola de espera. El método AddWaIter devuelve un nodo de nodo.
Después de regresar al nodo, AdquireQueue (nodo, 1) intentará actualizar nuevamente.
Si la actualización aún no se puede actualizar, el hilo se suspenderá a través de ParkandCheckInterrupt.
Método de desbloqueo de reentrantlock
Consulte el método de lanzamiento ().
Si la cabeza de la cola no está vacía y el estado de espera de la cabeza no es 0, se llama al método UncarkSuccessor ().
El método UneparkSuccessor () es el siguiente:
Haga el siguiente nodo Traverse de atrás hacia adelante para obtener el primer hilo en la cola con WaitStatus menos de 0. Luego continúe el hilo en el nodo.