2017-04-18 4 views
1
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?

    JVM confusing schema on this topic

    +4

    Schnelle Antwort: Verwenden Sie synchronisiert beim Lesen der Daten auch .. nur die Synchronisierung auf dem Set wird Thread-Bugs verursachen. –

    Antwort

    1

    Ihre Fragen sind ein bisschen zu allgemein.
    Was JVM? Es gibt viele von ihnen, mit vielen verschiedenen Versionen.

    Ich kenne HotSpot und OpenJDK JVMs (ich habe große Teile ihres Codes gelesen), und keiner von ihnen wird "Objekte" zwischenspeichern, weil die meisten der populären CPUs selbst es bereits effizienter machen.

    Wenn Sie von freigegebenen Daten aus verschiedenen Threads lesen oder schreiben, synchronisieren Sie dieses Feld (oder diese Felder) mit dem Schlüsselwort synchronized. Es wird Sichtbarkeit und richtige Speicherordnung gewährleisten.

    Verwandte Themen