Ich habe theoretische Frage über Speicher Sichtbarkeit. Hier ist ein Beispielcode:Warum Variable für andere Threads ohne Synchronisation sichtbar?
public class TwoThreadApp {
private static class A {
int x = 1;
}
public static void main(String[] arg) throws InterruptedException {
A a = new A();
Thread t2 = new Thread(() -> {
while (true) {
if (a.x == 2) {
System.out.println(a.x);
return;
}
// IO operation which makes a.x visible to thread "t2"
System.out.println("in loop");
}
});
t2.start();
Thread.sleep(100);
a.x = 2;
}
}
- Ohne
System.out.println("in loop")
Programme arbeiten auf unbestimmte Zeit, das Verhalten zu erwarten ist. - Aber mit
System.out.println("in loop")
ist es immer abgeschlossen, was nicht erwartet wird, weil a.x nicht flüchtig ist und es keine synchronisierten Blöcke gibt.
Mein env: ubuntu 16.04, openjdk 1.8.0_131
Warum es so verhält?
Die Variablen immer zugänglich sind (zum Lesen und Schreiben) becase es ist statisch und in der gleichen Klasse. Die Synchronisierung ist nur eine Möglichkeit, ein Objekt zu sperren, um die Integrität sicherzustellen. – gusto2
Da 'x' zwischengespeichert wird, hat die JVM diese Art von Optimierungen. –