Reentrantlock реализуется внутри с помощью экземпляров класса синхронизации.
Класс синхронизации определяется внутри повторного завода.
Синхронизируется от AbstractQueuedSynchronizer.
AbstractQueuedSynchronizer наследует от AbstractOwnablesyNchronizer.
Только переменная ExclusiveOwnerThread определяется в классе AbstractOwnablaOnlablesyNchronizer, представляющий поток, принадлежащий в настоящее время.
В дополнение к классу синхронизации, Reentrantlock также определяет два класса реализации внутри.
Nonfairsync - это несправедливое замк. Fairsync - это честный замок.
Две конструкции Reentrantlock заключаются в следующем:
Метод блокировки повторного блока
Несомарный метод блокировки
Метод CompareAndsetState является методом CAS. Этот метод пытается обновить переменную в объекте. Переменная ожидает, что будет 0, обновлена до 1.
Если обновление успешно, установите переменную ExclusiveOwnerThread в текущий поток. Затем метод блокировки вернется немедленно.
Если обновление не удается, приобретается (1).
В методе приобретения TryAcquire () называется сначала и попытайтесь снова обновить.
Метод TryAcquire () несправедливой блокировки выглядит следующим образом:
Метод NonfairtryAcquire () несправедливой блокировки называется внутренне методом NonfairtryAcquire следующим образом:
Если метод TryAcquire () пробуется снова без успеха. Во -первых, будет вызван метод AddWaiter () для добавления текущего потока в очередь ожидания. Метод AddWaiter возвращает узел узла.
После возвращения в узел, приобретенный (Node, 1) попытается снова обновиться.
Если обновление все еще не может быть обновлено, поток будет приостановлен через Parkandcheckinterrupt.
Метод разблокировки повторного разблокировки
Проверьте метод релиза ().
Если голова очереди не является пустой, а состояние ожидания головы не равно 0, вызывается метод Unparksuccorsor ().
Метод UnparkSuccessor () выглядит следующим образом:
Сделайте ближайший узел сзади сзади, чтобы получить первый поток в очереди с Waitchstatus меньше 0. Затем продолжайте поток на узле.