Les blocages et les méthodes Synchronisées

J'ai trouvé un code sur un Débordement de Pile et j'ai pensé que c'est assez similaire à ce que je suis confronté mais je ne comprends toujours pas pourquoi ce serait s'engager dans une impasse. L'exemple est tiré de La détection de blocage en 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();
  }
}

Dans ce cas, lorsque le Blocage() constructeur est appelé, il commence lui-même comme un fil. Quand il fait cela, la méthode run() est invoquée. Il va appeler b.methodB(a), qui appelle une.last() il suffit d'imprimer une déclaration. Dans le même temps, une.methodA(b) b.last(). Il n'y a pas de croix dépendances sur n'importe quel objet et ils ne sont pas l'exécution d'une méthode à une même trop de temps. Même si elles le sont, la synchronisation de mot-clé serait la file d'attente, ne serait-il pas? Mais comment se fait ce serait parfois entrer dans une impasse? Il n'est pas tout le temps mais qu'il serait parfois entrer dans une impasse, ce qui est tout à fait imprévisible. Qu'est-ce qui provoque ce pour aller dans une impasse et les solutions de contournement?

OriginalL'auteur Carven | 2011-06-07