private final Point p;
void synchronized setPoint(int x, int y) {
p.x=x;
p.y=y;
}
Point getPoint() {
return p;
}
Nehmen wir an, einige Klasse A hat das letzte Referenzfeld Point p.Können Objektfelder von JVM zwischengespeichert werden?
Das Objekt Point p wird im Konstruktor der Klasse A erstellt.
Die Klasse A muss threadsicher sein, daher gibt es den synchronisierten Setter setPoint, der die inneren Felder von p ändert.
Da die Referenz p endgültig ist, müssen wir uns nicht darum kümmern, die Referenz selbst in der Multithreading-Umgebung zu lesen. Aber was ist mit den inneren Daten des Objekts?
Kann JVM die inneren Daten von p für alle laufenden Threads im Cache speichern?
Und speichert JVM im Allgemeinen Daten von Heap (nicht von Stapeln) zu Caches? Wenn ja, wie sollten solche Felder behandelt werden, da sich das flüchtige Schlüsselwort nur auf die Referenz selbst und nicht auf das referenzierte Objekt auswirkt? Oder ist es in Ordnung, links Getter und es hat keine Sichtbarkeitsprobleme?
Schnelle Antwort: Verwenden Sie synchronisiert beim Lesen der Daten auch .. nur die Synchronisierung auf dem Set wird Thread-Bugs verursachen. –