자바 동시성은 '실제로 자바 동시성'에서 잠금 재진입에 대한 몇 가지 예제 코드입니다 :재진입 잠금 연습 여기
class Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling superclass doSomething");
}
}
class LoggingWidget extends Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling subclass doSomething");
super.doSomething();
}
}
이 책은 설명하고 그 위의 코드에서 ... "를 해봐요 방법 때문에 Widget과 LoggingWidget은 둘 다 동기화되며, 진행하기 전에 위젯에 대한 잠금을 획득하려고 시도합니다. "
위의 코드를 실행하여 고유 잠금을 관찰했습니다. 위의 인용문은 스레드가 위젯 개체의 본질적인 잠금을 획득한다는 것을 암시하는 것으로 보이지만 스레드에서 LoggingWidget에 대한 잠금을 획득한다는 것이 관찰되었습니다. 획득 수를 확인하는 방법을 모르겠으므로이를 관찰 할 수 없었습니다.
LoggingWidget/Widget의 이름이 같은 의미로 사용 되었습니까? 아니면 위젯 객체에 대한 잠금을 구체적으로 준수해야합니까?
편집 : 전체 발췌
재입는 잠금 행동의 캡슐화를 용이하게하고, 따라서 객체 지향 동시 코드의 개발을 단순화합니다. 재진입 잠금이 없으면 서브 클래스가 synchronized 메소드를 대체 한 후 수퍼 클래스 메소드를 호출하는 Listing 2.7의 매우 자연스러운 코드 은 교착 상태가됩니다. 위젯과 LoggingWidget의 doSomething 메소드가 모두 동기화되었으므로 계속 진행하기 전에 각 위젯에 대한 잠금을 에 획득하려고 시도합니다. 그러나 내재 된 자물쇠가 인 경우 재 호출이 허용되지 않는 경우 이미 보유 된 것으로 간주되어서 자물쇠를 획득 할 수 없으므로 스레드는 영구적으로 대기를 중지하여 을 획득 할 수 없으므로 super.doSomething을 호출 할 수 없습니다. Reentrancy는 이와 같은 상황에서 교착 상태를 방지합니다.
하나의 스레드 교착 상태 - 나에게 이상하게 보임 – gstackoverflow