2013-04-30 31 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

报价解释它。 – 2013-04-30 02:59:05

+3

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

回答

1

这是一个典型的死锁,2个线程+2个锁。

1)线索1锁阿方和移动到锁定加斯

2)螺纹2锁加斯并且移动到锁定阿尔

3)线索1到达加斯但它是由线程2和线程1块锁定

4)螺纹2到达阿尔但它是由线程1锁定,它阻止

在此处添加的延迟,以增加概率

public synchronized void bow(Friend bower) { 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
...