正しく同期されたプログラムはまだデータ競合を許可しますか?(パートI)での議論では、 2つの非常に良い例があります。
2つ目について話したいだけです。便宜上、ここに2番目の例を示します。
public int hashCode() {
if (hash == 0 && count > 0) { //(1)
int h = hash;
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h; //(2)
}
return hash; //(3)
}
発生前の関係の定義の最初の項目によると、xとyが同じスレッドのアクションであり、プログラムの順序でxがyの前にある場合、hb(x、y)、次の結論が得られる可能性があります。
hb((1)、(2))とhb((2)、(3))があるため、hb((1)、(3))です。
なぜなら:
ハッシュは共有変数です。
(1)、(2)、(3)はすべて同じスレッドのアクションです。
プログラム順に、(1)が(2)の前に、(2)が(3)の前に来る。
さて、私の質問に戻りましょう。(1)と(3)の間に起こる前の関係がある場合、(1)と(3)は決して並べ替えるべきではありません。
私の説明に誤解はありますか?あなたの意見はどうですか?