Erlaubt ein korrekt synchronisiertes Programm noch Datenrennen? (Teil I)

Es gibt zwei Schlussfolgerungen von JLS:

C1: Wenn ein Programm frei von Datenrassen ist, scheinen alle Ausführungen des Programms sequentiell konsistent zu sein:data-race-free => sequentially consistentC2: Wenn ein Programm korrekt synchronisiert ist, scheinen alle Ausführungen des Programms nacheinander konsistent zu sein:correctly synchronized => sequentially consistent

Wenn die Umkehrung von C1 wahr ist, können wir folgern, dass:

C3: Wenn ein Programm korrekt synchronisiert ist, ist es frei von Datenrennen:correctly synchronized => data-race-free

Leider gibt es in der JLS keine solche Aussage, daher komme ich zu der vierten Schlussfolgerung:

C4: Ein Programm kann korrekt synchronisiert werden und Datenrennen haben.

Aber ich bin mit diesem Ansatz nicht zufrieden und möchte einen Beweis dafür erhalten, dass diese Schlussfolgerung richtig (oder falsch) ist, auch auf informelle Weise oder in beispielhafter Weise.

Zunächst denke ich, dass ein Codesegment, das eine sequentiell konsistente Ausführung eines Multithread-Programms zeigt, das ein Datenrennen enthält, hilfreich ist, um dieses Problem zu verstehen und zu lösen.

Nach ernsthaften Überlegungen kann ich immer noch keine richtige Probe finden. Würden Sie mir bitte ein solches Codesegment geben?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage