domanda Forse simile:Perché le variabili in Java non sono volatili per impostazione predefinita?
Do you ever use the volatile keyword in Java?
Oggi stavo debug di mio gioco; Aveva un problema di thread molto difficile che si presentava ogni pochi minuti, ma era difficile da riprodurre. Quindi prima ho aggiunto la parola chiave
synchronized
a ciascuno dei miei metodi. Non ha funzionato. Quindi ho aggiunto la parola chiave
volatile
a ogni campo. Il problema sembrava risolversi da solo.
Dopo alcuni esperimenti, ho trovato che il campo responsabile era un oggetto GameState
che teneva traccia dello stato attuale del mio gioco, che può essere in riproduzione o occupato. Se occupato, il gioco ignora l'input dell'utente. Quello che avevo era un thread che modificava costantemente la variabile state
, mentre il thread Event legge la variabile state
. Tuttavia, dopo che un thread ha modificato la variabile, sono necessari alcuni secondi affinché l'altro thread riconosca le modifiche, il che causa il problema.
È stato risolto rendendo la variabile di stato volatile
.
Perché non sono variabili in Java volatile
per impostazione predefinita e quale motivo non utilizzare la parola chiave volatile
?
Per lo stesso motivo, i metodi non sono sincronizzati per impostazione predefinita. –
@mP: io non la penso così. Volatile e sincronizzato non sono equivalenti: la volatilità non può causare deadlock. –