私は次の記事を読んでいまし た 。
「マルチスレッド コードで .NET Int32 を読み取るときに、.NET Int32 をロックする必要がありますか?」
記事で説明されているように、それが 32 ビット SO の Int64 である場合、破損する可能性があることを理解しています。しかし、Int32 の場合、次の状況を想像しました。
class Test
{
private int example = 0;
private Object thisLock = new Object();
public void Add(int another)
{
lock(thisLock)
{
example += another;
}
}
public int Read()
{
return example;
}
}
Read メソッドにロックを含める理由がわかりません。あなたは?
更新(Jon Skeet および ctacke による) 回答に基づいて、上記のコードがマルチプロセッサ キャッシュに対して依然として脆弱であることを理解しています (各プロセッサには独自のキャッシュがあり、他のプロセッサとは同期されていません)。以下の 3 つの変更はすべて、問題を修正します。
- 「int example」に「volatile」プロパティを追加する
- Thread.MemoryBarrier(); の挿入 「int example」を実際に読む前に
- 「lock(thisLock)」内の「int example」を読む
また、「揮発性」が最もエレガントなソリューションだと思います。