對於我的編程語言類,我們給了一個簡單的Java死鎖例子,並被要求解決它。我不直接想要這個問題的答案,我主要想知道我的理解缺乏的地方。下面的代碼:請幫我理解這個死鎖的例子
import java.applet.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
// Attempt at a simple handshake. Girl pings Boy, gets confirmation.
// Then Boy pings girl, get confirmation.
class Monitor {
String name;
public Monitor (String name) { this.name = name; }
public String getName() { return this.name; }
// Girl thread invokes ping, asks Boy to confirm. But Boy invokes ping,
// and asks Girl to confirm. Neither Boy nor Girl can give time to their
// confirm call because they are stuck in ping. Hence the handshake
// cannot be completed.
public synchronized void ping (Monitor p) {
System.out.println(this.name + " (ping): pinging " + p.getName());
p.confirm(this);
System.out.println(this.name + " (ping): got confirmation");
}
public synchronized void confirm (Monitor p) {
System.out.println(this.name+" (confirm): confirm to "+p.getName());
}
}
class Runner extends Thread {
Monitor m1, m2;
public Runner (Monitor m1, Monitor m2) {
this.m1 = m1;
this.m2 = m2;
}
public void run() {
//System.out.println(m1.getName() + " about to ping " + m2.getName());
m1.ping(m2);
}
}
public class DeadLock {
public static void main (String args[]) {
int i=1;
System.out.println("Starting..."+(i++));
Monitor a = new Monitor("Girl");
Monitor b = new Monitor("Boy");
(new Runner(a, b)).start();
(new Runner(b, a)).start();
}
}
當我執行上面的代碼,我相信下面的應該發生的每一次(儘管它沒有,因爲有時候我們死鎖):
女孩坪男孩,在把鎖方法ping()
。女孩,在ping()
內,試圖撥打boy.confirm()
。男孩的confirm()
的答案,從而使我們回到Girl.ping()
它完成,取消關閉ping()
,和男孩的例子做的完全一樣的事情。有了所有的鎖,看起來整個程序是序列化的,雖然這樣就打破了多線程的目的?無論如何,我通常會得到下面的輸出
Starting...1
Girl (ping): pinging Boy
Boy (confirm): confirm to Girl
Girl (ping): got confirmation
Boy (ping): pinging Girl
Girl (confirm): confirm to Boy
Boy (ping): got confirmation
但是有時我們得到了一個僵局,輸出變爲:
Girl (ping): pinging Boy
Boy (ping): pinging Girl
我不明白,我們怎麼能在這種狀態下獲得,雖然,因爲它似乎當我們第一次進入時,我們鎖定了ping()
方法,那麼如果女孩已經在使用它,男孩甚至會打電話給ping()
?當男孩正忙着打電話給ping()
時,女孩試圖撥打boy.confirm()
?
你的目標是讓你的程序可序列化。它並沒有打破多線程的目的。當你有一個資源和多個線程時,就不會產生魔法,即多線程不能同時使用資源。 – UmNyobe