2013-04-30 2 views
2
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(); 
    } 
} 

онлайн учебник говоритГде происходит тупик в этом коде? Java

При запуске Тупик, это весьма вероятно, что оба потока будут блокировать, когда они пытаются вызвать bowBack. Ни один из блоков никогда не закончится, потому что каждый поток ждет другого, чтобы выйти из лука.

Но я не вижу здесь никакой взаимозависимости. Может ли кто-нибудь объяснить, где находится тупик?

+0

Цитата объясняет это. –

+3

http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock?rq=1 – Thihara

ответ

1

Это классический тупик, 2 нитки + 2 замка.

1) Тема 1 замки Альфонс и двигается, чтобы заблокировать Гастон

2) Тема 2 замка Гастон и перемещает для блокировки Альфонс

3) Тема 1 достигает Гастона, но она заблокирована Тема 2 и thread1 блоков

4) тема 2 достигает Альфонса, но она заблокирована тема 1 и блокирует

добавить задержку здесь, чтобы увеличить вероятность

public synchronized void bow(Friend bower) { 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
... 
Смежные вопросы