web-dev-qa-db-fra.com

Java Bloc synchronisé pour .class

Qu'est-ce que cela signifie Java code? Va-t-il se verrouiller sur tous les objets de MyClass?

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

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

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

L'extrait synchronized(X.class) utilise l'instance de classe comme moniteur. Comme il n'y a qu'une seule instance de classe (l'objet 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 gardé 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 y a exactement un thread par instance. Si cela rend le code réel dans le bloc thread-safe dépend de l'implémentation. Si mutate, seul l'état de l'instance synchronized(this) suffit.

138
Thomas Jung

Pour ajouter 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
}
78
Jorn

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

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

Quant à savoir si cela rend vos threads sûrs, c'est une question beaucoup plus complexe - nous aurions besoin de voir votre code!

21
David M