Deadlock - dlaczego?

Deadlock - dlaczego?
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:7
0

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:

Kopiuj
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

edytowany 1x, ostatnio: bogdans
bogdans
!Umieszczaj kod w znacznikach <code=java></code>
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:7
1

Ok, już wiem. Chodzi o czas wykonania wątku. Można wywalić println i dać samego sleepa i deadlock sie zreprodukuje.

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
0

Deadlock nie ma nic wspólnego z funkcją format.

Problemem jest to, że mamy dwa wątki. Każdy z nich musi uzyskać dostęp jednocześnie do dwóch monitorów. Możliwe jest, że wątek 1 uzyska dostęp do monitora 1, a wątek 2 równocześnie uzyska dostęp do monitora 2. Obydwa wątki będą próbować uzyskać dostęp do brakującego monitora, ale to im się nie uda.

Rozwiązaniem jest np. to, aby obydwa wątki próbowały uzyskać monitory w tej samej kolejności (czyli, aby obydwa wykonywały "alphonse.bow(gaston);"). Ewentualnie można mieć tylko jeden wspólny monitor.


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 2x, ostatnio: __krzysiek85

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.