Beispiel zu volatile

Volatile heißt soviel wie, dass die Variable jedesmal aus dem Speicher gelesen wird wenn sie gebraucht wird.
Sonst wird sie gecached, dass heißt der Prozess legt eine lokale Kopie an und nimmt diese Kopie, wenn er den Wert braucht. Dieses Verhalten ist für Konstanten, Parameter etc. erwünscht, weil der Cache schneller ist als der Arbeitsspeicher, aber für z.B. Abbruchbedingungen oder Iteratoren, die auch von anderen Threads geändert werden können, nicht erwünscht. Für diese erzwingt man mit volatile dann das Lesen aus dem Arbeitsspeicher um sicherzugehen, das man hier immer den aktuellen Wert hat. Ein praxisnahes Beispiel wäre ein Lock auf eine Datei. Thread 1 locked die Datei um zu schreiben, Thread 2 will die Datei lesen, hat den Wert für Lock (false) gecached und fängt an zu lesen obwohl die Datei gerade geschrieben wird.

Sorry für das denglisch.
 
In so einem Fall wie ikosaeder ihn beschrieben hat, würde ich persönlich eher mit synchronized oder Atomic-Datentypen arbeiten.
Ein anderer Anwendungsfall wäre, wenn sich Java-Code mit nativem Code Variablen oder Objekte teilt.
Siehe auch die Java Language Specification, http://docs.oracle.com/javase/specs/ Seite 209ff.
 
Zurück