O Reentrantlock é implementado internamente por instâncias de classe Sync.
A classe de sincronização é definida dentro do reentrantlock.
A sincronização herda do abstratoQueedSynchronizer.
AbstractQueUedSynchronizer herda do abstratoPownablesynchronizer.
Somente uma variável exclusiva do proprietário é definida na classe AbstractOWLABLESSYCHRONIZER, representando o thread atualmente de propriedade.
Além da classe Sync, o ReentrantLock também define duas classes de implementação internamente.
O não -FairSync é uma fechadura injusta. Fairsync é uma fechadura justa.
As duas construções do Reentrantlock são as seguintes:
Método de bloqueio de reentrantlock
Método de bloqueio injusto
O método ComparaDSetState é um método CAS. Este método tenta atualizar uma variável no objeto. A variável espera ser 0, atualizada para 1.
Se a atualização for bem -sucedida, defina a variável Exclusivewnerthread como o thread atual. Em seguida, o método de bloqueio retornará imediatamente.
Se a atualização falhar, adquirir (1) será chamado.
No método adquirente, o TryAcquire () é chamado primeiro e tente atualizar novamente.
O método TryAcquire () de trava injusta é o seguinte:
O método não -FairtryAcquire () da trava injusta é chamado internamente pelo método Non -FairtryAcquire da seguinte forma:
Se o método TryAcquire () for tentado novamente sem sucesso. Primeiro, o método addwaiter () será chamado para adicionar o encadeamento atual à fila de espera. O método Addwaiter retorna um nó.
Depois de retornar ao nó, adquirir (nó, 1) tentará atualizar novamente.
Se a atualização ainda não puder ser atualizada, o thread será suspenso através do ParkandCheckInterrup.
Método de desbloqueio do Reentrantlock
Confira o método Release ().
Se a cabeça da fila não estiver vazia e o estado de espera da cabeça não for 0, o método UMSPARKSUCESSOR () será chamado.
O método UMPARKSUCESSOR () é o seguinte:
Faça o próximo nó atravessar de volta para a frente para obter o primeiro thread na fila com WaitStatus menor que 0. Então continue o thread no nó.