2010-09-25 14 views
0

Je suis un débutant à Java EE. Je me demande s'il y a des cas d'interblocage communs dans la couche d'application Java EE, résultant de l'utilisation de la primitive de synchronisation Java - mot-clé synchronisé. Si oui, pourrait aider à donner un exemple?Impasse de thread dans l'application Java EE

Répondre

0
public void myMethod1() throws Exception { 
    synchronized (MyClass.class) { 

     Thread.sleep(10*1000); 

     synchronized (MyClass2.class) { 
     } 
    } 
} 

public void myMethod2() throws Exception {  
    synchronized (MyClass2.class) { 

     Thread.sleep(10*1000); 

     synchronized (MyClass1.class) { 
     } 

    } 
} 

Appel myMethod1 d'un fil et d'autres myMethod2 fil et vous obtiendrez une impasse.

+0

Un bel exemple! Est-ce commun dans servlet ou EJB? Ou cela arrive-t-il dans les applications J2SE? –

+1

Cela peut arriver dans tous les cas. La chose à noter ici est que nous prenons des serrures dans l'ordre inverse. Lorsque des verrous sont pris, nous devons toujours prendre des verrous dans le même ordre prédéterminé afin que les blocages ne se produisent pas. –

2

A partir de la spécification EJB 3.1, chapitre 21.2.2. Restrictions de programmation:

Un haricot d'entreprise ne doit pas utiliser du fil primitives de synchronisation à l'exécution de synchroniser plusieurs instances , sauf si elle est un bean session Singleton avec haricot géré concurrency .

Et le raisonnement est aussi intéressant:

La synchronisation ne fonctionnera que si les cas dans plusieurs JVMs de l'entreprise distribuée conteneur bean EJB.

+0

Une idée de comment cela est dans EJB 3.0? Il n'a pas encore de singelton, donc les primitives de synchronisation semblent le seul moyen de le contourner ... – mglauche