Witam
Jestem tu nowy, więc chylę czoła przed wszystkimi.
Mam pewien problem: znalazłem na stronie Oracle przykład kodu generującego deadlock. Wszystko fajnie, bo problem jest zrozumiały, przykład też wydawał się prosty.
http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Oto kod:
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());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
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();
}
}
Wszystko fajnie, bo uruchomiłem kod, faktycznie natychmiast występuje deadlock. Ale zaciekawilo mnie uzycie funkcji "format", kombinowałem przy tym kodzie, naszło mnie, żeby zmienić na "System.out.println" i - jakie zdziwko - nagle deadlock przestał się reprodukować.
Czy ktoś wie może dlaczego tak się dzieje? Dlaczego jak w powyższym kodzie zamieni się "System.out.format" na "System.out.println" (oczywiście zmieniając znaki procent na plusiki, żeby się kompilowało) to nie dostanie się deadlocka?
Pozdro
Mietek
<code=java></code>