pregunta posiblemente similar:¿Por qué las variables en Java no son volátiles por defecto?
Do you ever use the volatile keyword in Java?
Hoy estaba depurando mi juego; Tenía un problema de enhebrado muy difícil que aparecía cada pocos minutos, pero era difícil de reproducir. Así que primero agregué la palabra clave
synchronized
a cada uno de mis métodos. Eso no funcionó. Luego agregué la palabra clave
volatile
a cada campo. El problema parecía arreglarse solo.
Después de un poco de experimentación, encontré que el responsable del campo era un objeto GameState
que hacía un seguimiento del estado actual de mi juego, que puede ser jugar u ocupado. Cuando está ocupado, el juego ignora la entrada del usuario. Lo que tenía era un hilo que cambiaba constantemente la variable state
, mientras que el hilo del evento lee la variable state
. Sin embargo, después de que un hilo cambia la variable, el otro hilo tarda varios segundos en reconocer los cambios, lo que finalmente causa el problema.
Se corrigió haciendo que la variable de estado volatile
.
¿Por qué no hay variables en Java volatile
de forma predeterminada y cuál es el motivo para no utilizar la palabra clave volatile
?
Por la misma razón, los métodos no están sincronizados por defecto. –
@mP: No lo creo. Volátiles y sincronizados no son equivalentes: la volatilidad no puede causar interbloqueos. –