Java Synchronized-Block für .class-
-
20-09-2019 - |
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 ??
}
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