Acontece antes de relacionamentos com campos voláteis e blocos sincronizados em Java - e seu impacto em variáveis ​​não voláteis?

Ainda sou muito novo no conceito de threading e tento entender mais sobre isso. Recentemente, me deparei com um post no blogO que significa volátil em Java por Jeremy Manson, onde ele escreve:

Quando um thread grava em uma variável volátil, e outro thread vê esse write, o primeiro thread informa o segundo sobretodos dos conteúdos de memória até executar a gravação para aquela variável volátil. [...]todos do conteúdo da memória visto pelo Tópico 1, antes de escrever para[volatile] ready, deve estar visível para o Thread 2, depois de ler o valortrue paraready. [ênfase adicionada por mim]

Agora, isso significa que todas as variáveis ​​(voláteis ou não) mantidas na memória do Thread 1 no momento da gravação na variável volátil se tornarão visíveis para o Thread 2 depois de ler essa variável volátil? Se então,é possível confundir essa declaração junto das fontes oficiais de documentação / Oracle do Java? E de qual versão do Java em diante isso funcionará?

Em particular, se todos os Threads compartilharem as seguintes variáveis ​​de classe:

private String s = "running";
private volatile boolean b = false;

E o segmento 1 executa o seguinte primeiro:

s = "done";
b = true;

E o Thread 2 então executa depois (depois que o Thread 1 escreveu no campo volátil):

boolean flag = b; //read from volatile
System.out.println(s);

Isso seria garantido para imprimir "feito"?

O que aconteceria se em vez de declararb Comovolatile Eu coloco a escrita e leio em umsynchronized quadra?

Além disso, em uma discussão intitulada "As variáveis ​​estáticas são compartilhadas entre os threads?", @TREEescreve:

Não use volátil para proteger mais de uma parte do estado compartilhado.

Por quê? (Desculpe, eu não posso comentar ainda sobre outras questões, ou eu teria perguntado lá ...)