Beachten Sie den nachstehenden Code Sniper:
package sync;
public class LockQuestion {
private String mutable;
public synchronized void setMutable(String mutable) {
this.mutable = mutable;
}
public String getMutable() {
return mutable;
}
}
Zum Zeitpunkt Time1 wird Thread1 die Variable "mutable" aktualisieren. Die Synchronisierung ist im Setter erforderlich, um den Speicher vom lokalen Cache in den Hauptspeicher zu leeren. Zum Zeitpunkt Time2 (Time2 > Time1, keine Thread-Konkurrenz) liest Thread Thread2 den Wert der Variable mutable.
Frage ist - muss ich synchronized vor getter setzen? Sieht aus wie dies wird keine Probleme verursachen - Speicher sollte aktuell sein und Thread2's lokalen Cache-Speicher sollte ungültig & aktualisiert von Thread1, aber ich bin nicht sicher.
9 Stimmen
Threading in Java ist definiert als passiert-vor Beziehungen. Versuchen Sie nicht, in Begriffen wie "flushing caches" zu denken, denn das wäre falsch. Zum einen sind die Optimierungen des Compilers wichtig. Selbst wenn das Flushing von Caches ein genaues Modell wäre, wäre die Reihenfolge der Aktualisierungen nicht garantiert, wenn das verwiesene Objekt veränderbar ist. (Bis zur Spezifikation 1.5 verwendete die Spezifikation ein Flushing-Caches-Modell, das jedoch nicht implementierbar war).