Es gibt zwei verschiedene Verwendungen des Schlüsselworts volatile.
- Verhindert, dass die JVM Werte aus Registern (z.B. Cache) liest und erzwingt, dass der Wert aus dem Speicher gelesen wird.
- Reduziert das Risiko von Fehlern bei der Speicherkonsistenz.
Verhindert, dass die JVM die Werte in den Registern liest, und zwingt ihre Wert aus dem Speicher zu lesen.
A Besetztzeichen wird verwendet, um zu verhindern, dass ein Thread fortgesetzt wird, während das Gerät beschäftigt ist und das Kennzeichen nicht durch eine Sperre geschützt ist:
while (busy) {
/* do something else */
}
Der Test-Thread wird fortgesetzt, wenn ein anderer Thread die Besetztzeichen :
busy = 0;
Da jedoch im Test-Thread häufig auf busy zugegriffen wird, kann die JVM den Test optimieren, indem sie den Wert von busy in einem Register ablegt und dann den Inhalt des Registers testet, ohne den Wert von busy vor jedem Test im Speicher zu lesen. Der Test-Thread würde niemals sehen, dass sich busy ändert, und der andere Thread würde nur den Wert von busy im Speicher ändern, was zu einem Deadlock führen würde. Das Deklarieren der Besetztzeichen als flüchtig bezeichnet, muss ihr Wert vor jedem Test gelesen werden.
Reduziert das Risiko von Speicherkonsistenzfehlern.
Die Verwendung volatiler Variablen verringert das Risiko von Speicherkonsistenzfehler weil jedes Schreiben in eine flüchtige Variable eine "passiert-vor" Beziehung zu den nachfolgenden Messwerten derselben Variablen. Dies bedeutet, dass Änderungen an einer flüchtigen Variablen immer für andere Threads sichtbar sind.
Die Technik des Lesens und Schreibens ohne Speicherkonsistenzfehler wird als atomare Wirkung .
Eine atomare Aktion ist eine Aktion, die tatsächlich auf einmal stattfindet. Eine atomare Aktion kann nicht mittendrin aufhören: Entweder geschieht sie vollständig oder gar nicht. Die Nebenwirkungen einer atomaren Aktion sind nicht sichtbar, bis die Aktion abgeschlossen ist.
Nachfolgend finden Sie Aktionen, die Sie angeben können und die atomar sind:
- Lesen und Schreiben sind atomar für Referenzvariablen und für die meisten primitiven Variablen (alle Typen außer long und double).
- Lese- und Schreibvorgänge sind für alle deklarierten Variablen atomar flüchtig (einschließlich Long- und Double-Variablen).
Zum Wohl!