Flüchtig (vltl): Leicht verdunstend bei normalen Temperaturen
Wichtiger Punkt über volatile
:
- Die Synchronisierung in Java ist durch die Verwendung von Java-Schlüsselwörtern möglich
synchronized
et volatile
und Schlösser.
- In Java können wir nicht haben
synchronized
variabel. Verwendung von synchronized
Schlüsselwort mit einer Variablen ist illegal und führt zu einem Kompilierungsfehler. Anstelle der Verwendung des synchronized
Variable in Java zu verwenden, können Sie die java volatile
Variable, die JVM-Threads anweist, den Wert von volatile
Variable aus dem Hauptspeicher und speichern Sie sie nicht lokal zwischen.
- Wenn eine Variable nicht von mehreren Threads gemeinsam genutzt wird, ist es nicht notwendig, die
volatile
Stichwort.
Quelle
Beispiel für die Verwendung von volatile
:
public class Singleton {
private static volatile Singleton _instance; // volatile variable
public static Singleton getInstance() {
if (_instance == null) {
synchronized (Singleton.class) {
if (_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
Wir erstellen die Instanz erst dann, wenn die erste Anfrage kommt.
Wenn wir nicht die _instance
variabel volatile
dann wird der Thread, der die Instanz von Singleton
ist nicht in der Lage, mit dem anderen Thread zu kommunizieren. Wenn also Thread A eine Singleton-Instanz erstellt und kurz nach der Erstellung die CPU beschädigt wird usw., können alle anderen Threads den Wert von _instance
als nicht null, und sie werden glauben, dass es immer noch als null zugewiesen wird.
Warum ist das so? Weil Leser-Threads nicht sperren und bis der Schreiber-Thread aus einem synchronisierten Block herauskommt, wird der Speicher nicht synchronisiert und der Wert von _instance
wird nicht im Hauptspeicher aktualisiert. Mit dem Schlüsselwort Volatile in Java wird dies von Java selbst gehandhabt, und solche Aktualisierungen sind für alle Leser-Threads sichtbar.
Schlussfolgerung : volatile
Schlüsselwort wird auch verwendet, um den Inhalt des Speichers zwischen Threads zu kommunizieren.
Beispiel für die Verwendung von ohne flüchtig:
public class Singleton{
private static Singleton _instance; //without volatile variable
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null) _instance = new Singleton();
}
}
return _instance;
}
Der obige Code ist nicht thread-sicher. Obwohl er den Wert der Instanz innerhalb des synchronisierten Blocks noch einmal überprüft (aus Leistungsgründen), kann der JIT-Compiler den Bytecode so umstellen, dass der Verweis auf die Instanz gesetzt wird, bevor der Konstruktor seine Ausführung beendet hat. Das bedeutet, dass die Methode getInstance() ein Objekt zurückgibt, das möglicherweise nicht vollständig initialisiert wurde. Um den Code thread-sicher zu machen, kann seit Java 5 das Schlüsselwort volatile für die Instanzvariable verwendet werden. Variablen, die als flüchtig gekennzeichnet sind, werden für andere Threads erst sichtbar, wenn der Konstruktor des Objekts seine Ausführung vollständig beendet hat.
Quelle
volatile
Verwendung in Java :
Die ausfallsicheren Iteratoren sind typischerweise implementiert mit einer volatile
Zähler auf dem Listenobjekt.
- Wenn die Liste aktualisiert wird, wird der Zähler erhöht.
- Wenn ein
Iterator
erstellt wird, wird der aktuelle Wert des Zählers in die Iterator
Objekt.
- Wenn ein
Iterator
Operation durchgeführt wird, vergleicht die Methode die beiden Zählerwerte und löst einen ConcurrentModificationException
wenn sie unterschiedlich sind.
Die Implementierung von ausfallsicheren Iteratoren ist in der Regel leichtgewichtig. Sie beruhen in der Regel auf den Eigenschaften der Datenstrukturen der jeweiligen Listenimplementierung. Es gibt kein allgemeines Muster.