Threads Programm läuft nicht weiter, Deadlock?

Crumar

Mitglied
Hallo allerseits, ich fand einfach direkt mal an.
Ich habe folgenden Code:
Java:
public class Kindness {
    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 lena = new Friend("Lena");
        final Friend johanna = new Friend("Johanna");
        new Thread(new Runnable() 
        {
            public void run(){
                lena.bow(johanna);
            }
        }).start();
        new Thread(new Runnable() 
        {
            public void run(){
                johanna.bow(lena);
            }
        }).start();

    }
}

So und ich muss nun wissen warum das so passiert, wie es passiert. Ich hab es ausprobiert und die Ausgabe ist:
Lena: Johanna has bowed to me!
Johanna: Lena has bowed to me!

Ich versteh jetz nun nicht ganz wieso es nicht weitergeht.

Meine Gedankengänge waren das man start() und nicht run() benutzt, allerdings hab ich dann gelesen, dass Start ist und dann auch ein eigener Thread erzeugt wird im Gegensatz zu run() und auch wenn ich run() benutze hört das programm auf:

Lena: Johanna has bowed to me!
Johanna: Lena has bowed back to me !
Johanna: Lena has bowed to me!
Lena: Johanna has bowed back to me !

Immerhin hat man jetzt schon ein bowBack.

Das 2te was mir in den Sinn kommt ist ein Deadlock, wegen dem Synchronized.. Dass da zuviele Zugriffe auf die Instanzmethoden kommen, und es daher nicht weitergeht. Aber auch wenn ich das weglasse, erscheint bei run() dasselbe und bei start() dann doch dasselbe wie bei run()

EDIT:Kann es sein, dass es daran liegt das bow bowBack aufruft und dann versucht wird bowback auszuführen während aber bow auch noch ausgeführt wird?

3. Überlegung: Aufgrund der anonymous threads werden diese nur einmal ausgeführt (kann ich mir eigentlich nicht vorstellen)

Gehe ich mit einem in die richtige Richtung oder sind alle falsch?

Vielen Dank schonmal fürs durchlesen :D

MfG Crumar
 
Zuletzt bearbeitet:
S

SlaterB

Gast
das Programm hat keine Schleifen und die Aufrufe sind auch nicht endlos rekursiv, die 4 Zeilen von der run-Variante sind wirklich das Maximum derzeit,

durch Synchronisation und gegenseitigen Deadlock eben noch weniger, wobei das schon erstaunlich zu erreichen ist,
ohne die Ausgabe-Zeilen würden die Aufrufe viel zu schnell passieren als dass genau gleichzeitig die synchronized-Blöcke betreten werden
 
N

nillehammer

Gast
Meine Gedankengänge waren das man start()
Run ruft man nie direkt auf. Insofern ist start() richtig. Bei folgender Konstellation kann tatsächlich ein Deadlock auftreten:
Thread-1 holt für bow() sich Sperre auf lena
Thread-2 holt sich für bow() Sperre auf johanna
Thread-1 hätte für bowBack() gerne Sperre auf lena (geht aber nicht, weil Thread-2 sie noch hat).
Thread-2 hätte für bowBack() gerne Sperre auf johanna (geht aber nicht, weil Thread-1 sie noch hat).
==> Ergo, Deadlock
Dein Gedankengang dazu war also richtig.
 

Crumar

Mitglied
Oh gott, ich hab gar nicht bedacht das ein thread ja nicht so einfach wiederholt wird, wenn keine schleife drin ist :p

Aber das bei start und synchronized kein bowback kommt, liegt dann am deadlock?

Und bei run() wird das ja nicht parallel ausgeführt, deshalb kommt der bowback zustande?
 

Oben