Deadlocks und Synchronisierte Methoden

Habe ich einen gefunden, der code auf Stack Overflow und ich dachte, es ist ziemlich ähnlich zu dem, was ich bin mit, aber ich verstehe immer noch nicht, warum das betreten einer Sackgasse. Das Beispiel wurde entnommen aus Deadlock-Erkennung in Java:

Class A
{
  synchronized void methodA(B b)
  {
    b.last();
  }

  synchronized void last()
  {
    System.out.println(“ Inside A.last()”);
  }
}

Class B
{
  synchronized void methodB(A a)
  {
    a.last();
  }

  synchronized void last()
  {
    System.out.println(“ Inside B.last()”);
  }
}

Class Deadlock implements Runnable 
{
  A a = new A(); 
  B b = new B();

  //Constructor
  Deadlock()
  {
    Thread t = new Thread(this); 
    t.start();
    a.methodA(b);
  }

  public void run()
  {
    b.methodB(a);
  }

  public static void main(String args[] )
  {
    new Deadlock();
  }
}

In diesem Fall, wenn der Deadlock () - Konstruktor aufgerufen wird, beginnt es sich wie ein Roter Faden. Wenn es dies tut, werden die run () - Methode aufgerufen. Es ruft b an.methodB(a), das ruft dann ein.last() nur drucken Sie eine Erklärung. Zur gleichen Zeit, ein.methodA(b) nennen würde.b.last(). Es gibt keine Kreuz-Abhängigkeiten auf jedes Objekt, und Sie sind nicht der Ausführung einer Methode gleichzeitig zu. Selbst wenn Sie es sind, die synchronisiert Stichwort anstehen hätte Sie, wäre es nicht? Aber wie kommen diese gelegentlich geben Sie einen deadlock zu? Es ist nicht die ganze Zeit, aber es würde manchmal geben Sie einen deadlock, das ist ziemlich unvorhersehbar. Was ist es, das bewirkt, dass dieser gehen in einen deadlock und workarounds?

InformationsquelleAutor Carven | 2011-06-07

Schreibe einen Kommentar