Hi,
in meinem Javabuch steht ein Beispiel, wie ein komplettes Programm zum Stillstand durch synchronized Methoden gebracht wird.
Eins verwirrt mich jedoch:
Ich dachte der Stillstand wird dadruch hervogerufen, dass 2 Threads sich gegenseitig von synchronized Methoden aufrufen wollen.
Also Thread a sitzt in methode y und will methode x ansprechen. Aber Thread b sitzt zurselben Zeit in mthode x und will methode y ansprechen.
Da synchronized Methoden nur ein Thread gleichzeitig ranlassen, kommt es zum Stillstand.
Aber anscheinend geht dieses Beispiel anders:
a.last() und b.last() sind ja nicht von anderen Threads besetzt, darum müsste es doch normalerweise gehen.
Aber praktisch kommt es tatsächlich zum Stillstand.
Oder kann eine Instanz von einer Klasse nur eine Methode gleichzeitig aufrufen?!
Liebe Grüße
Reality
in meinem Javabuch steht ein Beispiel, wie ein komplettes Programm zum Stillstand durch synchronized Methoden gebracht wird.
Eins verwirrt mich jedoch:
Ich dachte der Stillstand wird dadruch hervogerufen, dass 2 Threads sich gegenseitig von synchronized Methoden aufrufen wollen.
Also Thread a sitzt in methode y und will methode x ansprechen. Aber Thread b sitzt zurselben Zeit in mthode x und will methode y ansprechen.
Da synchronized Methoden nur ein Thread gleichzeitig ranlassen, kommt es zum Stillstand.
Aber anscheinend geht dieses Beispiel anders:
Code:
class A
{
synchronized void foo(B b)
{
String name= Thread.currentThread().getName();
System.out.println(name+" hat A.foo betreten.");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println("A unterbrochen");
}
System.out.println(name+" versucht B.last() aufzurufen");
b.last();
}
synchronized void last()
{
System.out.println("In A.last");
}
}
class B
{
synchronized void bar(A a)
{
String name= Thread.currentThread().getName();
System.out.println(name+" hat B.bar betreten");
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
System.out.println("B unterbrochen");
}
System.out.println(name+" versucht A.last() aufzurufen.");
a.last();
}
synchronized void last()
{
System.out.println("In A.last");
}
}
class Deadlock implements Runnable{
A a= new A();
B b= new B();
Deadlock(){
Thread.currentThread().setName("MainThread");
Thread t= new Thread(this, "RacingThread");
t.start();
a.foo(b); //Errichte Sperre für a in diesem Thread
System.out.println("Zurück im Haupt-Thread");
}
public void run()
{
b.bar(a); //Errichte Sperre für b im anderen Thread
System.out.println("Zurück im anderen Thread");
}
public static void main(String[] args) {
new Deadlock();
}
}
a.last() und b.last() sind ja nicht von anderen Threads besetzt, darum müsste es doch normalerweise gehen.
Aber praktisch kommt es tatsächlich zum Stillstand.
Oder kann eine Instanz von einer Klasse nur eine Methode gleichzeitig aufrufen?!
Liebe Grüße
Reality