In einfachen Worten,
statisch : static
Variablen sind der Klasse zugeordnet und nicht mit irgendwelchen Objekt zugeordnet . Jede Instanz der Klasse teilt eine Klassenvariable, die sich an einem festen Ort im Speicher befindet
flüchtig : Dieses Schlüsselwort gilt sowohl für die Klasse als auch für Instanz - Variablen.
Die Verwendung flüchtiger Variablen verringert das Risiko von Speicherkonsistenzfehlern, da durch das Schreiben in eine flüchtige Variable eine Beziehung hergestellt wird, bevor sie mit nachfolgenden Lesevorgängen derselben Variablen in Beziehung steht. Dies bedeutet, dass Änderungen an einer flüchtigen Variablen für andere Threads immer sichtbar sind
Schauen Sie sich diesen Artikel von anJavin Paul
, um flüchtige Variablen besser zu verstehen.
In Abwesenheit von volatile
kein Schlüsselwort vorhanden ist, kann der Wert der Variablen im Stapel jedes Threads unterschiedlich sein. Wenn Sie die Variable als volatile
festlegen, erhalten alle Threads den gleichen Wert in ihrem Arbeitsspeicher, und Speicherkonsistenzfehler wurden vermieden.
Hier der Begriff variable
entweder static
(Klassen-) Variable oder instance
(Objekt-) Variable sein.
Zu Ihrer Anfrage:
Wie auch immer, ein statischer Variablenwert wird auch ein Wert für alle Threads sein. Warum sollten wir uns dann für flüchtig entscheiden?
Wenn ich instance
in meiner Anwendung eine Variable benötige , kann ich diese nicht verwendenstatic
Variable verwenden. Selbst im Fall einer static
Variablen kann die Konsistenz aufgrund des Thread-Cache nicht garantiert werden, wie in der Abbildung gezeigt.
Verwenden von volatile
Variablen verringert das Risiko von Speicherkonsistenzfehlern, da bei jedem Schreiben in eine flüchtige Variable eine Beziehung hergestellt wird, die vor dem Lesen derselben Variablen auftritt. Dies bedeutet, dass Änderungen an einer flüchtigen Variablen für andere Threads immer sichtbar sind.
Darüber hinaus bedeutet dies, dass ein Thread beim Lesen einer flüchtigen Variablen nicht nur die letzte Änderung der flüchtigen Variablen sieht, sondern auch die Nebenwirkungen des Codes, der zur Änderung geführt hat => Speicherkonsistenzfehler sind bei flüchtigen Variablen weiterhin möglich . Um Nebenwirkungen zu vermeiden, müssen Sie synchronisierte Variablen verwenden. Aber es gibt eine bessere Lösung in Java.
Die Verwendung des einfachen Zugriffs auf atomare Variablen ist effizienter als der Zugriff auf diese Variablen über synchronisierten Code
Einige der Klassen im java.util.concurrent
Paket bieten atomare Methoden, die nicht auf Synchronisation beruhen.
Weitere Informationen finden Sie in diesem Artikel zur Steuerung der Parallelität auf hoher Ebene .
Vor allem hat einen Blick auf Atomic Variablen .
Verwandte SE-Fragen:
Flüchtig gegen Atomic
Volatile Boolean vs AtomicBoolean
Unterschied zwischen flüchtig und synchronisiert in Java