ReintrantLock은 SYNC 클래스 인스턴스에 의해 내부적으로 구현됩니다.
SYNC 클래스는 ReintrantLock 내부에서 정의됩니다.
AbstractQueuedSynchronizer에서 상속을 동기화합니다.
AbstractQueuedSynchronizer는 AbstractownableSynchronizer에서 상속합니다.
독점 소유자가 변수 만 현재 소유 한 스레드를 나타내는 AbstractownablesyNchronizer 클래스에 정의됩니다.
ReintrantLock은 SYNC 클래스 외에도 내부적으로 두 개의 구현 클래스를 정의합니다.
Nonfairsync는 불공정 한 자물쇠입니다. Fairsync는 공정한 자물쇠입니다.
재진입 락의 두 가지 구성은 다음과 같습니다.
재진입 락 잠금 방법
불공정 잠금 방법
CompareAndsetState 메소드는 CAS 메소드입니다. 이 방법은 객체의 변수를 업데이트하려고 시도합니다. 변수는 0이 될 것으로 예상되며 1으로 업데이트됩니다.
업데이트가 성공하면 독점 소유자가 변수를 현재 스레드로 설정하십시오. 잠금 방법이 즉시 돌아옵니다.
업데이트가 실패하면 (1) 호출됩니다.
획득 메소드에서 TryAcquire ()가 먼저 호출되어 다시 업데이트를 시도합니다.
불공정 자물쇠의 tryacquire () 방법은 다음과 같습니다.
불공정 자물쇠의 비 에어 트리 키이어 () 메소드는 내부적으로 NonfairtryAcquire 메소드에서 다음과 같이 호출됩니다.
tryacquire () 메소드가 성공하지 않고 다시 시도되는 경우. 먼저, addwaiter () 메소드가 호출되어 현재 스레드를 대기 대기열에 추가합니다. AddWaiter 메소드는 노드 노드를 반환합니다.
노드로 돌아온 후 aquirequeued (Node, 1)는 다시 업데이트를 시도합니다.
업데이트를 여전히 업데이트 할 수 없으면 ParkandCheckinterRupt를 통해 스레드가 중단됩니다.
재진입 락 잠금 해제 메소드
release () 메소드를 확인하십시오.
대기열의 헤드가 비어 있고 헤드의 대기 상태가 0이 아닌 경우 unparksuccessor () 메소드가 호출됩니다.
unparksuccessor () 메소드는 다음과 같습니다.
다음 노드 트래버스를 뒤쪽에서 앞쪽으로 만들려면 퀴즈의 첫 번째 스레드를 0 미만으로 가져 오십시오. 그런 다음 노드의 스레드를 계속하십시오.