In parole povere,
statico : le staticvariabili sono associate alla classe , piuttosto che a qualsiasi oggetto . Ogni istanza della classe condivide una variabile di classe, che si trova in una posizione fissa in memoria
volatile : questa parola chiave è applicabile a variabili di classe e di istanza .
L'uso di variabili volatili riduce il rischio di errori di coerenza della memoria, poiché qualsiasi scrittura su una variabile volatile stabilisce una relazione accidentale prima delle successive letture della stessa variabile. Ciò significa che le modifiche a una variabile volatile sono sempre visibili ad altri thread
Date un'occhiata a questo articolo per Javin Paul capire le variabili volatili in un modo migliore.

In assenza di volatileparola chiave, il valore della variabile nello stack di ogni thread potrebbe essere diverso. Rendendo la variabile come volatile, tutti i thread avranno lo stesso valore nella loro memoria di lavoro e sono stati evitati errori di coerenza della memoria.
Qui il termine variablepuò essere staticvariabile (classe) o variabile instance(oggetto).
Per quanto riguarda la tua richiesta:
Ad ogni modo un valore variabile statico sarà anche un valore per tutti i thread, quindi perché dovremmo scegliere volatile?
Se ho bisogno di una instancevariabile nella mia applicazione, non posso usare la staticvariabile. Anche in caso di staticvariabili, la coerenza non è garantita a causa della cache dei thread, come mostrato nel diagramma.
L'uso delle volatilevariabili riduce il rischio di errori di coerenza della memoria, poiché qualsiasi scrittura su una variabile volatile stabilisce una relazione accidentale prima delle successive letture della stessa variabile. Ciò significa che le modifiche a una variabile volatile sono sempre visibili ad altri thread.
Inoltre, significa che quando un thread legge una variabile volatile, vede non solo l'ultima modifica alla volatile, ma anche gli effetti collaterali del codice che ha portato alla modifica => gli errori di coerenza della memoria sono ancora possibili con le variabili volatili . Per evitare effetti collaterali, è necessario utilizzare variabili sincronizzate. Ma c'è una soluzione migliore in Java.
L'uso dell'accesso semplice alle variabili atomiche è più efficiente dell'accesso a queste variabili tramite codice sincronizzato
Alcune delle classi nel java.util.concurrentpacchetto forniscono metodi atomici che non si basano sulla sincronizzazione.
Fare riferimento a questo articolo di controllo della concorrenza di alto livello per maggiori dettagli.
Soprattutto dai un'occhiata alle variabili atomiche .
Domande SE correlate:
Volatile Vs Atomic
Volatile booleano vs AtomicBoolean
Differenza tra volatile e sincronizzato in Java