Estoy trabajando en el código de otra y se encontró con el equivalente a esto:
for (int i = 0; i < someVolatileMember; i++) {
// Removed for SO
}
Donde someVolatileMember
se define así:
private volatile int someVolatileMember;
Si un poco de hilo, A, se ejecuta el bucle y el otro hilo, B, escribe a someVolatileMember
continuación, supongo que el número de iteraciones que hacer cambiaría mientras que el hilo A ejecuta el bucle que no es muy grande. Asumo que esto sería solucionarlo:
final int someLocalVar = someVolatileMember;
for (int i = 0; i < someLocalVar; i++) {
// Removed for SO
}
Mis preguntas son :
- Sólo para confirmar que el número de iteraciones hilo A no se puede cambiar mientras el bucle es activo si modifica hilo B
someVolatileMember
- Que la copia no volátil local es suficiente para asegurarse de que cuando el hilo A corre el hilo de bucle B no puede cambiar el número de iteraciones
Su comprensión es correcta:
Por la especificación del lenguaje Java , la semántica de un
volatile
campo de garantizar la coherencia entre los valores observados después de las actualizaciones realizadas entre diferentes temas:El lenguaje de programación Java proporciona un segundo mecanismo,
volatile
campos, que es más conveniente que el bloqueo para algunos propósitos.Un campo puede ser declarado
volatile
, en cuyo caso se garantiza el modelo de memoria de Java que todas las discusiones ver un valor constante para la variable (§17.4).Tenga en cuenta que incluso sin el
volatile
modificador, el recuento de bucle es probable que cambie en función de muchos factores.Una vez que una
final
se le asigna variable, su valor nunca se cambia por lo que la cuenta de bucles no va a cambiar.