이것은 Joshua Bloch가 쓴 책에서 가져온 것입니다.스레드가 이미 보유하고있는 잠금을 획득하려고하면 어떻게됩니까?
저는 영어가 모국어가 아니므로 의심의 여지가없는 이유를 묻습니다. 쓰레드가 이미 보유하고 잠금을 획득 을 시도하는 경우 고유 잠금 재진입 때문에
요청 이 성공합니다. Reentrancy는 ** 당 호출 **보다는 스레드 당 에서 잠금이 획득됨을 의미합니다.
메소드 단위 호출을 의미합니까? 니핏을 고려
class Factoriser{
public synchronized void doSomething(){
// code goes here
}
}
이 스레드 A는 상기 인스턴스 메소드 해봐요를 갖는 오브젝트에 잠금을 획득 할 수있는 가정하자. 같은 thread thread A가 같은 오브젝트 인스턴스 메소드 doSomething()에 대해서 락을 취득하는 몇개인가의 이유에 의해 (이전의 락이 아직 릴리즈되어 있지 않은 것도 상상해보십시오).
Joshua의 설명을 올바르게 이해하면 2 개의 메소드 호출/호출이 있어도 하나의 잠금 만있을 것입니다. 제 이해가 100 % 정확합니까? 예증 해주십시오. 나는 저자가 아래 문단에서 이것을 분명하게하기 때문에 혼란 스럽다.
재진입은 각 잠금과 획득 카운트와 소유 스레드를 연관시킴으로써 구현됩니다. 카운트가 0이면 잠금이 해제 된 것으로 간주됩니다. 스레드가 이전에 잠금 해제 된 잠금을 획득하면 JVM은 소유자 을 기록하고 획득 수를 1로 설정합니다. 동일한 스레드 이 다시 잠금을 획득하면 소유 스레드가 동기화 된 블록을 종료 할 때 카운트가 증가하면 카운트가 감소됩니다. 카운트가 0에 도달하면 잠금이 해제됩니다.
Reentrancy/locks 획득이 호출 기준이 아닌 경우 위에서 설명한 시나리오에서 JVM에 의해 수행 된 카운트가 2로 설정된 이유는 무엇입니까?
** ** 굵게 ** ** 많이 ** 있습니다. 사실 ** 너무 대담합니다 ** ** 무의미 해지고 ** ** 산만 해졌습니다 **. – Andreas
개체 당 하나의 잠금 장치 만 있습니다. 임의의 수의 호출은 동일한 잠금을 요구합니다 (성공적으로). 마지막 잠금이 해제되면 개체가 더 이상 잠기지 않습니다. 이게 왜 어려운가요? – markspace
@ Andreas : 고마워. 제거되었습니다. –