次のステートメントを見てみましょう。
int d0, d1;
int[] ds = {0, 0};
これで、1つのスレッドに次の指示があります。
d0++;
d1++;
他のスレッドにはこの命令があります:
ds[1] = d1;
ds[0] = d0;
これらのスレッドを並行して実行する場合ds
、{0、0}、{1、1}、および{1、0}のように見える3つの組み合わせが明らかにあります。
ここで大きな問題は、{0、1}も存在できるかということです。コンパイラ/JVMは、命令が無関係であると見なすため、命令を単純に交換できますか?はいの場合、そのような動作の「ルール」は正確には何であり、それはコンパイラーまたはJVM次第ですか?