이 예제는 교착 상태가 발생하는 방법을 보여줍니다. 내가 이해하지 못하는 한 가지는 인스턴스 alphone의 메소드 bow를 호출하는 첫 번째 thead가 gaston.bowbBack (이)를 실행하려고 할 때 스레드가 잠금을 해제하고 인스턴스 gaston의 잠금을 획득하는지 여부입니다. , 그것은 두 번째 스레드가 소유하지 않는다고 가정합니다. 또는 동시에 두 개의 잠금을 유지할 것인가? 메소드의 모든 코드가 완전히 실행됩니다. 그리고 또 다른 질문은, 스레드가 자물쇠를 잡고 있는지 확인하는 방법이 있습니까?스레드가 동시에 두 개의 잠금을 유지할 수 있습니까?
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
ok이 예제를 볼 때마다 자르기가 시작됩니다. 이걸 복제본으로 닫으려고 할 때마다 우리는이 문제를 많이 해결했습니다. 그리고 예, 스레드가 한 번에 둘 이상의 잠금을 가질 수없는 이유는 없습니다. 링크 된 게시물에 대한 선택된 대답은 무슨 일이 일어날 것인지 철자해야합니다. –