In einfachen Worten,
statisch : staticVariablen 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 volatilefestlegen, 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 instancein meiner Anwendung eine Variable benötige , kann ich diese nicht verwendenstatic Variable verwenden. Selbst im Fall einer staticVariablen 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.concurrentPaket 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