Frage

Was bedeutet diese Java-Code bedeuten? Wird es Sperre für alle Objekte von MyClass gewinnen?

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

Und wie die oben genannten Code unterscheidet sich von dieser:

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

Lösung

Das Snippet synchronized(X.class) verwendet die Klasseninstanz als Monitor. Da es nur eine Klasseninstanz (das Objekt, das die Klasse Metadaten zur Laufzeit) ein Faden ist, kann in diesem Block sein.

Mit synchronized(this) wird der Block von der Instanz bewacht. Für jede Instanz nur ein Thread kann den Block eingeben.

synchronized(X.class) wird verwendet, um sicherzustellen, dass es genau ein Thema in dem Block. synchronized(this) garantiert, dass es pro Instanz genau ein Faden ist. Wenn dies den eigentlichen Code im Block Thread-sicher macht, hängt von der Implementierung. Wenn mutieren nur Status der Instanz synchronized(this) ist genug.

Andere Tipps

zu den anderen Antworten hinzuzufügen:

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

entspricht

static synchronized void myMethod() {
  //code
}

und

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

entspricht

synchronized void myMethod() {
  //code
}

Nein, die erste eine Sperre für die Klassendefinition von MyClass erhalten, nicht alle Instanzen davon. Wenn es jedoch in einer Instanz verwendet wird, wird dies effektiv alle anderen Instanzen blockieren, da sie eine einzige Klassendefinition teilen.

Die zweite wird nur eine Sperre auf der aktuellen Instanz erhalten.

Zur Frage, ob dies Ihre Objekte Thread-sicher macht, dass eine weitaus komplexere Frage ist - wir bräuchten Ihren Code sehen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top