Ich habe den nächsten einfache Klasse Code erstellt (die nur für meine Frage Klärung ist):Deadlock-Situation mit verschiedenen Aktionen (Methoden) auf dem gleichen Objekt erstellen?
public class StudioClass {
synchronized void dancing(String name) {
System.out.println(name + " is dancing");
}
synchronized void singing(String name) {
System.out.println(name + " is singing");
}
public class StudentA extends Thread {
String name;
public StudentA(String name) {
this.name = name;
}
@Override
public void run() {
dancing(name);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
singing(name);
}
}
public class StudentB extends Thread {
String name;
public StudentB(String name) {
this.name = name;
}
@Override
public void run() {
singing(name);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
dancing(name);
}
}
In diesem Beispiel ist die Reihenfolge Aktionen von Schülern A sind: Tanz und dann und Schüler singen B sind: singen und als tanzen. Dieses Szenario ist eine klassische Situation für eine Deadlock
.
Wie kann ich bewusst eine Deadlock
Situation durch diese Aktionen erstellen? Die einfache Lösung (wie ich es verstehe) ist es, jede Aktion (Gesang & Tanzen) als verschiedene Objekte zu definieren, aber ich frage mich, gibt es andere Wege, sie als Methoden zu behalten?
Was ich meine, ist StudentA führt Aktion x dann Aktion y und StudentB führt Aktion y zuerst und dann Aktion x. Gibt es eine Möglichkeit, aus diesem Szenario einen Stillstand zu bekommen? – Nimrod
In Ihrem Szenario wartet jeder Thread auf seinen Zug. Um ein Deadlock zu haben, müssen Sie annehmen, dass zwei Threads aufeinander warten. Sie sollten sich ein komplexeres Szenario mit einem gemeinsamen Objekt zwischen Threads oder zwischen Abhängigkeiten zwischen Aktionen vorstellen. – davidxxx