Sería un manejo de una solicitud de red subsiguiente hilo se garantiza a ver el valor de una variable volátil escrita durante una solicitud anterior?

Alex W:

Tengo esta pregunta teórica sobre el modelo de memoria de Java. Supongamos que tengo un servidor con estos dos controladores de solicitudes en la clase siguiente:

class MyHandlers {
  volatile int someFlag = 0;

  String handleFirstRequest() {
    someFlag = 1;
    return "Hello!";
  }

  String handleSecondRequest() {
    return "value of someFlag: " + someFlag;
  }
}

También tengo un cliente. Mi cliente envía una solicitud de red que los desencadenantes ejecutar handleFirstRequest. El cliente espera hasta que se complete la solicitud. Una vez que se complete la primera petición, el cliente envía la segunda petición que desencadena handleSecondRequest.

Pregunta: ¿Cómo previene el modelo de memoria de Java la respuesta a la segunda petición de ser "value of someFlag: 0"?

Notas: Entiendo que, en la práctica, el manejo de la segunda respuesta hilo se vea siempre someFlagcomo 1.

Si leo la JMM correctamente, hay una orden de sincronización que es un orden total, lo que ordenará la lectura y la escritura volátil volátil ( someFlag = 1) en mi ejemplo. Si la lectura es posterior a la escritura, entonces la lectura se ve la escritura. ¿Es posible tener un caso donde la escritura es posterior a la lectura? En este caso, la escritura no se sincroniza con la lectura-y no habría sucede, antes de relación entre la escritura y la lectura. Esto llevaría el hilo manejo de la segunda solicitud para ver someFlagcomo 0. De dónde viene mi mal ir entendimiento?

Pensamientos adicionales (2020 Mar 2): El JMM no se refiere al concepto de tiempo. Acciones de sincronización están ordenados de acuerdo al orden de sincronización, pero nada en el JMM dice que el orden de sincronización es el mismo que el orden de las acciones ordenadas por el tiempo. Esto sugiere una implementación de Java podrá ordenar la lectura de someFlag antes de la escritura a pesar de que la lectura se produjo después de la escritura de acuerdo con el reloj. Parece que la JMM sólo garantiza que si la lectura volátil se ordenó después de la escritura volátil, a continuación, escribe antes de la escritura no volátil son visibles para lee después de la lectura volátil.

Alex W:

He encontrado mi respuesta!

Sección 17.4.3 de la especificación del lenguaje Java afirma lo siguiente:

La consistencia secuencial es una garantía muy fuerte que se hace sobre la visibilidad y la ordenación en la ejecución de un programa. Dentro de una ejecución secuencial consistente, existe un orden total sobre todas las acciones individuales (por ejemplo, lee y escribe) que es consistente con el orden del programa, y cada acción individual es atómico y es inmediatamente visible para todos los hilos .

En el modelo de memoria de Java, "acciones" se refieren a acciones inter-hilo, que incluyen escrituras volátiles. En este párrafo se garantiza que cualquier aplicación Java que se ajusta a las JLS garantiza que las escrituras volátiles serán inmediatamente visible para otros hilos. En el ejemplo en el puesto de apertura, este párrafo garantiza que la lectura volátil no puede ser pedido antes de la escritura volátil.

Supongo que te gusta

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