Bloc synchronisé Java pour .class

Que signifie ce code java? Va-t-il se verrouiller sur tous les objects de MyClass ?

 synchronized(MyClass.class) { //is all objects of MyClass are thread-safe now ?? } 

Et comment le code ci-dessus diffère de celui-ci:

 synchronized(this) { //is all objects of MyClass are thread-safe now ?? } 

L’extrait de synchronized(X.class) utilise l’instance de classe en tant que moniteur. Comme il n’y a qu’une seule instance de classe (l’object représentant les métadonnées de classe au moment de l’exécution), un thread peut être dans ce bloc.

Avec synchronized(this) le bloc est protégé par l’instance. Pour chaque instance, un seul thread peut entrer dans le bloc.

synchronized(X.class) est utilisé pour s’assurer qu’il y a exactement un thread dans le bloc. synchronized(this) garantit qu’il existe exactement un thread par instance. Si cela rend le code réel dans le bloc thread-safe dépend de l’implémentation. Si seule la mutation de l’état de l’instance synchronized(this) est suffisante.

Pour append aux autres réponses:

 static void myMethod() { synchronized(MyClass.class) { //code } } 

est équivalent à

 static synchronized void myMethod() { //code } 

et

 void myMethod() { synchronized(this) { //code } } 

est équivalent à

 synchronized void myMethod() { //code } 

Non, le premier obtiendra un verrou sur la définition de classe de MyClass , pas toutes les instances. Cependant, si elle est utilisée dans une instance, cela bloquera toutes les autres instances, car elles partagent une définition de classe unique.

Le second obtiendra un verrou sur l’instance actuelle uniquement.

Pour savoir si cela rend vos objects sûrs, c’est une question beaucoup plus complexe – nous aurions besoin de voir votre code!