¿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í ...)

Respuestas a la pregunta(3)

Su respuesta a la pregunta