セッターがロックで保護されているが、ゲッターの周りにロックがないプロパティがあるとします。
private long _myField;
public long MyProperty
{
get { return _myField; }
set { lock(whatever) _myField = value; }
}
書き込みの同期(読み取りではない)に加えて、ロック、つまりMonitor.Exitにより、不安定な書き込みが発生するはずです。ここで、2つのスレッドAとBがあり、次のシーケンスが発生するとします。
- Aはの現在の値を読み取ります
MyProperty
。 - Bはに新しい値を書き込みます
MyProperty
。 MyProperty
Aはの現在の値を再度読み取ります。
Q:Aは新しい値を確認できるようになりましたか?または、私たちのロックは、Bがタイムリーにメインメモリに書き込むことを保証しましたが、他のスレッドが新しい値を読み取ることは保証しませんでしたか?または、答えは、.Net 2+で実行しているか、「より弱い」ECMA実装で実行しているかによっても異なりますか?