bucle volátil de Java

Asim:

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 someVolatileMemberse define así:

private volatile int someVolatileMember;

Si un poco de hilo, A, se ejecuta el bucle y el otro hilo, B, escribe a someVolatileMembercontinuació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
manouti:

Su comprensión es correcta:

  1. Por la especificación del lenguaje Java , la semántica de un volatilecampo 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, volatilecampos, 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 volatilemodificador, el recuento de bucle es probable que cambie en función de muchos factores.

  2. Una vez que una finalse le asigna variable, su valor nunca se cambia por lo que la cuenta de bucles no va a cambiar.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136940&siteId=1
Recomendado
Clasificación