¿Qué sucede antes de las relaciones con los campos volátiles y los bloques sincronizados en Java, y su impacto en las variables no volátiles?
Todavía soy bastante nuevo en el concepto de subprocesos, y trato de entender más al respecto. Recientemente, me encontré con un blog enLo que significa volátil en Java por Jeremy Manson, donde escribe:
Cuando un hilo escribe en una variable volátil, y otro hilo ve esa escritura, el primer hilo le dice al segundo sobretodos del contenido de la memoria hasta que realizó la escritura en esa variable volátil. [...]todos de los contenidos de memoria vistos por el subproceso 1, antes de que escribiera a[volatile] ready
, debe estar visible para el subproceso 2, después de que lea el valortrue
paraready
. [énfasis añadido por mí mismo]
Ahora, ¿significa eso que todas las variables (volátiles o no) mantenidas en la memoria del subproceso 1 en el momento de la escritura en la variable volátil serán visibles para el subproceso 2 después de que lea esa variable volátil? Si es así,¿es posible confundir esa declaración con la documentación oficial de Java / fuentes de Oracle? ¿Y a partir de qué versión de Java funcionará?
En particular, si todos los subprocesos comparten las siguientes variables de clase:
private String s = "running";
private volatile boolean b = false;
Y el hilo 1 ejecuta primero lo siguiente:
s = "done";
b = true;
Y el subproceso 2 se ejecuta después (después de que el subproceso 1 escribió en el campo volátil):
boolean flag = b; //read from volatile
System.out.println(s);
¿Se garantizaría esto para imprimir "hecho"?
¿Qué pasaría si en lugar de declarar?b
comovolatile
Pongo la escritura y leo en unasynchronized
¿bloquear?
Adicionalmente, en una discusión titulada "¿Las variables estáticas se comparten entre hilos?", @Treeescribe:
No use volatile para proteger más de una pieza de estado compartido.
¿Por qué? (Lo siento; no puedo hacer comentarios sobre otras preguntas, o habría preguntado allí ...)