Por que a palavra-chave volátil não é necessária para sincronização de threads?

Eu estou lendo que ovolatile A palavra-chave não é adequada para sincronização de encadeamentos e, de fato, não é necessária para esses fins.

Embora eu entenda que o uso dessa palavra-chave não seja suficiente, não entendo por que é completamente desnecessário.

Por exemplo, suponha que tenhamos dois threads, o thread A que lê apenas uma variável compartilhada e o thread B que grava apenas em uma variável compartilhada. Sincronização adequada por ex. pthreads mutexes é imposto.

IIUC, sem a palavra-chave volátil, o compilador pode olhar para o código do segmento A e dizer: "A variável não parece ser modificada aqui, mas temos muitas leituras; vamos lê-lo apenas uma vez, armazenar em cache o valor e otimizar todas as leituras subsequentes. ”Além disso, ele pode observar o código do encadeamento B e dizer:“ Temos muitas gravações nessa variável aqui, mas nenhuma leitura; portanto, os valores escritos não são necessários e, portanto, vamos otimizar todas as gravações. "

Ambas as otimizações seriam incorretas. Eambos 1 seria impedido por voláteis. Então, eu provavelmente chegaria à conclusão de que, emboravolatile não é suficiente para sincronizar threads, ainda é necessário para qualquer variável compartilhada entre threads.(nota: agora li que, na verdade, não é necessário paravolatile para evitar elisões de gravação; por isso, estou sem ideias de como evitar otimizações incorretas)

Eu entendo que estou errado aqui. Mas por que?

questionAnswers(4)

yourAnswerToTheQuestion