2014-12-04 3 views
0

Пример иллюстрирует, как происходит взаимоблокировка. Есть одна вещь, которую я не понимаю, а это то, что, когда первый thead, который вызывает метод bow of instance alphone, собирается выполнить gaston.bowbBack (это), будет ли поток освобождать блокировку и получить блокировку экземпляра gaston if , предположим, что он не принадлежит второму потоку? или он будет удерживать два замка одновременно, чтобы весь код метода был выполнен полностью? И еще один вопрос: есть ли способ проверить, содержит ли поток блокировку?Может ли нить удерживать два замка одновременно?

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

Нить не освобождает замок в силу приобретения другого; он может содержать несколько замков. Re: Ваш второй вопрос, да есть способ увидеть, если текущий поток удерживает блокировку монитора объекта (Thread#holdsLock)