Um programa corretamente sincronizado ainda permite a corrida de dados? (Parte I)

Existem duas conclusões do JLS:

C1: Se um programa estiver livre de corridas de dados, todas as execuções do programa parecerão consistentes em seqüência:data-race-free => sequentially consistentC2: Se um programa for sincronizado corretamente, todas as execuções do programa parecerão consistentes em seqüência:correctly synchronized => sequentially consistent

Se o inverso de C1 for verdadeiro, então podemos concluir que:

C3: Se um programa está sincronizado corretamente, então ele está livre de raças de dados:correctly synchronized => data-race-free

Mas, infelizmente, não há tal declaração no JLS, então chego à quarta conclusão:

C4: Um programa pode ser sincronizado corretamente e ter corridas de dados.

Mas não estou satisfeito com essa abordagem e quero obter uma prova de que essa conclusão é verdadeira (ou falsa), mesmo de maneira informal ou por amostragem.

Primeiro de tudo, eu acho que um segmento de código que mostra uma execução sequencialmente consistente de um programa multi-threaded que contém uma corrida de dados é útil para entender e resolver esse problema.

Após séria consideração, ainda não consigo encontrar uma amostra adequada. Então você poderia me dar um segmento de código?

questionAnswers(3)

yourAnswerToTheQuestion