我想從Oracle的網站deadlock瞭解deadlock
但不知道爲什麼&兩個自定義線程進入死鎖狀態時。如何在下面的代碼中發生死鎖?
package com.geekthread.java.threads;
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");
//holds lock for alphonse
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
//holds lock for gastone
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
}
請糾正我的上述程序的理解: -
1)持有鎖的阿爾方斯·
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
2)存放着Gastone的鎖
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
我試圖從bowback中刪除同步關鍵字,但不會以死鎖狀態結束,即程序執行完成並且程序在執行後終止。
感謝
這是錯誤的:「由於Friend類是靜態類,Friend類的方法是靜態的。」類是靜態的,所以我們可以在同一個文件中有多個類。如果'Friend'在它自己的'Friend.java'文件中並且不是靜態的,則會發生死鎖 – dkatzel 2014-11-26 19:50:33
@dkatzel謝謝。沒有意識到java的靜態類概念。 – sbecker 2014-11-27 08:40:33