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á ...)

questionAnswers(3)

yourAnswerToTheQuestion