In parole povere,
statico : le static
variabili 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 volatile
parola 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 variable
può essere static
variabile (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 instance
variabile nella mia applicazione, non posso usare la static
variabile. Anche in caso di static
variabili, la coerenza non è garantita a causa della cache dei thread, come mostrato nel diagramma.
L'uso delle volatile
variabili 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.concurrent
pacchetto 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