2014-12-04 1 views
0

이 예제는 교착 상태가 발생하는 방법을 보여줍니다. 내가 이해하지 못하는 한 가지는 인스턴스 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(); 
     } 
    } 
+0

ok이 예제를 볼 때마다 자르기가 시작됩니다. 이걸 복제본으로 닫으려고 할 때마다 우리는이 문제를 많이 해결했습니다. 그리고 예, 스레드가 한 번에 둘 이상의 잠금을 가질 수없는 이유는 없습니다. 링크 된 게시물에 대한 선택된 대답은 무슨 일이 일어날 것인지 철자해야합니다. –

답변

2

1)의 모니터 잠금을 수용하는 경우이

... 
    synchronized (obj1) { 
     System.out.println(1); 
     synchronized (obj2) { 
      System.out.println(2); 
     } 
    } 
    ... 
처럼 볼 수있는 방법이

2) 스레드가 자물쇠를 잡고 있는지 확인할 수 있습니다. Thread.holdsLock(Object obj)

0

스레드는 다른 스레드를 획득하여 잠금을 해제하지 않습니다. 여러 개의 잠금을 보유 할 수 있습니다. 다시 : 두 번째 질문, 예 현재 스레드가 스레드가 하나 이상의 잠금을 가질 수있는 객체 (Thread#holdsLock)