Für meine Programmiersprachen-Klasse haben wir ein einfaches Java-Deadlock-Beispiel gegeben und werden gebeten, es zu lösen. Ich möchte nicht direkt die Antwort auf dieses Problem, ich möchte hauptsächlich wissen, wo mein Verständnis fehlt. Hier ist der Code:Bitte helfen Sie mir, dieses Deadlock-Beispiel zu verstehen
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();
}
}
Wenn ich führen Sie den obigen Code Ich glaube, die folgende jedes Mal passieren sollte (obwohl es nicht der Fall ist, denn manchmal Deadlock wir):
Mädchen Pings Boy, eine Sperre setzen auf die ping()
Methode. Mädchen, innerhalb ping()
, versucht, boy.confirm()
anzurufen. Boy's confirm()
Antworten, so bringt uns zurück zu Girl.ping()
, wo es endet, nimmt die Sperre von ping()
, und Boy Instanz genau das gleiche. Mit all den Sperren scheint es, dass das gesamte Programm serialisiert ist und somit den Zweck des Multithreading vereitelt. Egal, erhalte ich normalerweise die folgende Ausgabe
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
aber manchmal bekommen wir eine Sackgasse und der Ausgang wird:
Girl (ping): pinging Boy
Boy (ping): pinging Girl
Ich verstehe nicht, wie wir, obwohl in diesem Zustand bekommen, da es scheint Wir verriegeln die ping()
Methode, wenn wir zum ersten Mal reingehen, also wie könnte Boy ping()
anrufen, wenn das Mädchen es bereits benutzt? Versucht Mädchen, boy.confirm()
anzurufen, wenn Boy beschäftigt ist, ping()
zu rufen?
Ihr Ziel ist, dass Ihr Programm serialisierbar ist. Es verhindert nicht den Zweck des Multithreading. Wenn Sie eine Ressource und mehr als einen Thread haben, kann keine Magie erzeugt werden, dh mehrere Threads können die Ressource nicht gleichzeitig verwenden. – UmNyobe