Question

Qu'est-ce que ce code java signifie? Est-il gagner verrou sur tous les objets 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 ??
}
Était-ce utile?

La solution

Le synchronized(X.class) d'extrait utilise l'instance de classe comme un moniteur. Comme il n'y a qu'une seule instance de classe (l'objet représentant les métadonnées de classe à l'exécution) peut être un fil dans ce bloc.

Avec synchronized(this) le bloc est surveillé par l'instance. Pour tous les cas un seul thread peut entrer dans le bloc.

synchronized(X.class) est utilisé pour vous assurer qu'il ya exactement un fil dans le bloc. synchronized(this) assure qu'il ya exactement un fil par exemple. Si cela rend le code réel dans le thread-safe bloc dépend de la mise en œuvre. Si muter seul état de l'instance synchronized(this) suffit.

Autres conseils

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
}

Non, le premier sera obtenir un verrou sur la définition de la classe de MyClass, tous les cas de celui-ci. Toutefois, si elle est utilisée dans une instance, cela bloque efficacement tous les autres cas, car ils partagent une seule définition de la classe.

La seconde obtenir un verrou sur l'instance en cours.

Quant à savoir si cela rend vos objets thread-safe, qui est une question beaucoup plus complexe - nous aurions besoin de voir votre code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top