2016-04-28 21 views
0

Ich habe ein Problem mit diesem speziellen Deadlock-Beispiel aus dem Oracle-Tutorial zu verstehen. Ich denke, ich habe eine ziemlich gute Vorstellung davon, was Deadlocks sind (ich habe viele Beispiele gesehen, wo zwei abschließende Objektsperren erstellt werden und ein Thread den ersten und den zweiten den anderen gewinnt), aber dieser scheint komplexer zu sein.Ein kniffliges Deadlock-Beispiel

Warum genau kann nicht die BowBack() - Methode aufgerufen werden, ohne das Programm zu blockieren? Wenn die Methoden auf synchronisiert werden dies - Wenn ich es richtig verstehe, ist dies praktisch, wie synchronisierte Methoden funktionieren - dann teilen die Threads nicht eine Ressource, die dazu führen würde, dass sie aufeinander warten.

Ist es, weil, wenn Sie versuchen, eine synchronisierte Methode innerhalb einer anderen synchronisierten Methode aufzurufen, Sie "der einzige Thread" innerhalb dieser äußeren Methode sein müssen?

Von dem, was ich sammeln, sie beide geben Bogen() gleichzeitig und alles ist in Ordnung, bis bowBack() aufgerufen wird ...

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(); 
    } 
} 

Antwort

1

Der wichtigste Teil ist hier, dass der Parameter/Argument auch gesperrt ist, und die BOWBACK-Methode wird auf einem anderen Objekt aufgerufen, nicht auf this.

Wenn die Zeile stattdessen lesen this.bowback() alles wäre in Ordnung, aber es ist anotherObject.bowback(), und das Objekt versucht, auf sich selbst zu synchronisieren, ist aber bereits durch einen anderen Thread gesperrt.

Verwandte Themen