2015-09-08 2 views
0

Lorsqu'il y a une synchronisation réentrante, elle se déroule en boucle infinie et se termine avec l'exception StackOverflow.La synchronisation réentrante se déclenche en boucle infinie

Le code ci-dessous imprime d'abord "Outer" puis continue d'imprimer "Intérieur".

Quelqu'un peut-il me dire pourquoi est ce comportement?

public void outer() 
    { 
     synchronized (this) 
     { 
     System.out.println("Outer"); 
     inner(); 
     } 
    } 

    public void inner() 
    { 
     synchronized (this) 
     { 
     System.out.println("Inner"); 
     inner(); 
     } 
    } 

Répondre

2

Votre erreur n'a rien à voir avec le mot clé synchronize. Vous continuez à appeler une méthode de manière récursive sans retour. Un thread ne se bloque pas en essayant d'acquérir un verrou sur le même objet. Vous obtenez StackOverflowError parce que vous avez épuisé le nombre maximal de cadres de pile pour effectuer des appels à inner(). Ce comportement sera reproduit même sans synchronisation