Hallo zusammen,
irgendwie verstehe ich nicht wieso mir bei folgendem Code das hier ausgegeben wird:
Ich bin sogar davon ausgegangen das es gar kein Deadlock ist.
Alf führt z. B. als erstes die synchronized Methode bow aus. Nun würde Friend gesperrt werden. In der Methode bow würde nun bower als Karl die nächste synchronized Methode aufrufen und als übergabe- Parameter Alf. Da diese Methoden aber reentrant sind ging ich davon aus das es im ersten Fall durchlaufen würde und somit zu keinem Deadlock kommen.
Nun zeigt mir aber die Ausgabe oben etwas ganz anderes und ich verstehe überhaupt nicht wie es zu einem Deadlock in diesem Beispiel kommen kann :-( Wieso schaffen es beide Thread Aufrufe einmal in die synchroinzed "Umgebun"? Hängen müssten diese ja dann nach System.out.println(this.name + " : " + bower.getName() + " has bowed to me!");? Falls JA aber wieso? Ich komme da nicht mehr mit :-(
irgendwie verstehe ich nicht wieso mir bei folgendem Code das hier ausgegeben wird:
Alf : Karl has bowed to me!
Karl : Alf has bowed to me!
Java:
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.println(this.name + " : " + bower.getName() + " has bowed to me!");
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.println(this.name + " : " + bower.getName() + " has bowed back to me!");
}
}
public static void main(String[] args) {
final Friend alf = new Friend("Alf");
final Friend karl = new Friend("Karl");
new Thread(new Runnable() {
public void run() {
alf.bow(karl);
}
}).start();
new Thread(new Runnable() {
public void run() {
karl.bow(alf);
}
}).start();
}
}
Ich bin sogar davon ausgegangen das es gar kein Deadlock ist.
Alf führt z. B. als erstes die synchronized Methode bow aus. Nun würde Friend gesperrt werden. In der Methode bow würde nun bower als Karl die nächste synchronized Methode aufrufen und als übergabe- Parameter Alf. Da diese Methoden aber reentrant sind ging ich davon aus das es im ersten Fall durchlaufen würde und somit zu keinem Deadlock kommen.
Nun zeigt mir aber die Ausgabe oben etwas ganz anderes und ich verstehe überhaupt nicht wie es zu einem Deadlock in diesem Beispiel kommen kann :-( Wieso schaffen es beide Thread Aufrufe einmal in die synchroinzed "Umgebun"? Hängen müssten diese ja dann nach System.out.println(this.name + " : " + bower.getName() + " has bowed to me!");? Falls JA aber wieso? Ich komme da nicht mehr mit :-(