Was bedeutet dieser Java-Code? Wird es alle Objekte von sperren MyClass
?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
Und wie unterscheidet sich der obige Code von diesem:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
java
multithreading
synchronization
locking
synchronized
Andrew Tobilko
quelle
quelle
Antworten:
Das Snippet
synchronized(X.class)
verwendet die Klasseninstanz als Monitor. Da es nur eine Klasseninstanz gibt (das Objekt, das die Klassenmetadaten zur Laufzeit darstellt), kann sich ein Thread in diesem Block befinden.Mit
synchronized(this)
dem Block wird von der Instanz geschützt. Für jede Instanz darf nur ein Thread in den Block eintreten.synchronized(X.class)
wird verwendet, um sicherzustellen, dass sich genau ein Thread im Block befindet.synchronized(this)
stellt sicher, dass es genau einen Thread pro Instanz gibt. Ob dies den tatsächlichen Code im Block threadsicher macht, hängt von der Implementierung ab. Wenn mutieren, reicht nur der Status der Instanzsynchronized(this)
aus.quelle
So ergänzen Sie die anderen Antworten:
ist äquivalent zu
und
ist äquivalent zu
quelle
synchronized
Blöcke. Das macht sie gleichwertig. Wenn Sie ein Beispiel ändern, sind sie tatsächlich nicht mehr dieselben.Nein, der erste erhält eine Sperre für die Klassendefinition von
MyClass
, nicht für alle Instanzen davon. Bei Verwendung in einer Instanz werden jedoch alle anderen Instanzen effektiv blockiert, da sie eine einzige Klassendefinition verwenden.Der zweite wird nur für die aktuelle Instanz gesperrt.
Ob dies den Thread Ihrer Objekte sicher macht, ist eine weitaus komplexere Frage - wir müssten Ihren Code sehen!
quelle