Os erros voláteis de consistência de palavras-chave e memória

Na documentação Java da Oraclelocalizado aqui, é dito o seguinte:

As ações atômicas não podem ser intercaladas, portanto, podem ser usadas sem medo de interferência do encadeamento. No entanto, isso não elimina toda a necessidade de sincronizar ações atômicas, porque ainda são possíveis erros de consistência na memória. O uso de variáveis voláteis reduz o risco de erros de consistência da memória, porque qualquer gravação em uma variável volátil estabelece um relacionamento de antes do acontecimento com leituras subsequentes dessa mesma variável. Isso significa que as alterações em uma variável volátil são sempre visíveis para outros threads. Além disso, também significa que, quando um thread lê uma variável volátil, ele vê não apenas as alterações mais recentes no volátil, mas também os efeitos colaterais do código que levou à alteração.

Também diz:

As leituras e gravações são atômicas para variáveis de referência e para a maioria das variáveis primitivas (todos os tipos, exceto longos e duplos).As leituras e gravações são atômicas para todas as variáveis declaradas voláteis (incluindo variáveis longas e duplas).

Eu tenho duas perguntas sobre essas declarações:

"O uso de variáveis voláteis reduz o risco de erros de consistência da memória" - O que eles significam com "reduz o risco" e como ainda é possível um erro de consistência da memória ao usar o volátil?

Seria verdade que o único efeito de colocar volátil em uma primitiva não dupla e não longa é permitir o relacionamento "acontece antes" com leituras subsequentes de outros threads? Eu pergunto isso, pois parece que essas variáveis já têm leituras atômicas.

questionAnswers(6)

yourAnswerToTheQuestion