Hey, ich suche im Moment ein gutes Bsp für ein Deadlock. Es gibt im Inet zwar genügend Code-Examples, und ich sehe auch die Deadlocks darin, finde aber irgendwie dass die Beispiele an sich schon total künstlich konstruiert sind durch scheinbar willkürliches synchen von Methoden..
Das einzige was mir im Moment von einem Anwendungsfall in der Praxis einleuchtet ist das Philosophen-Problem. Allerdings ist das ziemlich komplex und ich frage mich ob es da nicht auch ein primitiveres Bsp gibt. Nun bei meiner Suche bin ich auf das von Sun gestoßen:
(Bem.: Es geht hier um eine Begrüßung von zwei Freunden durch Verbeugen, nicht ums Bogenschiessen Ist euch vllt klar aber ich hab das erstmal nich gerafft und dachte an ein RPG-Game oder so^^)
So, also ein Deadlock kann auftreten - ja. Aber ich verstehe das Beispiel nicht. Warum sind die Methoden überhaupt synchronized? Ich meine ohne synch kann bei (2) geswitcht werden, was dann zu einem selstsamen Programmablauf fürhen würde.
Aber mit synch kann halt bei (1) geswitcht werden, das sind lediglich paar nanosekunden vorher und der Programmablauf würde genauso in etwas Sinnlosem enden :bahnhof:
Meine Frage also: Warum sind die Methoden synchronisiert? Ich finde das Programm hat ne Logik die nicht das erfüllt was im Text zum Beispiel gesagt wird, und irgendwie könnten da jetzt ohne sync soviele Race Conditions knallen wie sie wollen, es würde den Ablauf nicht verändern. (Bzw das synchen stellt nicht sicher dass nicht genau der selbe Mist passiert)
Das einzige was mir im Moment von einem Anwendungsfall in der Praxis einleuchtet ist das Philosophen-Problem. Allerdings ist das ziemlich komplex und ich frage mich ob es da nicht auch ein primitiveres Bsp gibt. Nun bei meiner Suche bin ich auf das von Sun gestoßen:
(Bem.: Es geht hier um eine Begrüßung von zwei Freunden durch Verbeugen, nicht ums Bogenschiessen Ist euch vllt klar aber ich hab das erstmal nich gerafft und dachte an ein RPG-Game oder so^^)
Alphonse and Gaston are friends, and great believers in courtesy. A strict rule of courtesy is that when you bow to a friend, you must remain bowed until your friend has a chance to return the bow. Unfortunately, this rule does not account for the possibility that two friends might bow to each other at the same time. This example application, Deadlock, models this possibility:
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.format("%s: %s has bowed to me!%n",
this.name, bower.getName());
// (1)
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
// (2)
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");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
So, also ein Deadlock kann auftreten - ja. Aber ich verstehe das Beispiel nicht. Warum sind die Methoden überhaupt synchronized? Ich meine ohne synch kann bei (2) geswitcht werden, was dann zu einem selstsamen Programmablauf fürhen würde.
Aber mit synch kann halt bei (1) geswitcht werden, das sind lediglich paar nanosekunden vorher und der Programmablauf würde genauso in etwas Sinnlosem enden :bahnhof:
Meine Frage also: Warum sind die Methoden synchronisiert? Ich finde das Programm hat ne Logik die nicht das erfüllt was im Text zum Beispiel gesagt wird, und irgendwie könnten da jetzt ohne sync soviele Race Conditions knallen wie sie wollen, es würde den Ablauf nicht verändern. (Bzw das synchen stellt nicht sicher dass nicht genau der selbe Mist passiert)
Zuletzt bearbeitet: