最近、メモリバリアと並べ替えの問題について読みましたが、今では混乱しています。
次のシナリオを検討してください。
private object _object1 = null;
private object _object2 = null;
private bool _usingObject1 = false;
private object MyObject
{
get
{
if (_usingObject1)
{
return _object1;
}
else
{
return _object2;
}
}
set
{
if (_usingObject1)
{
_object1 = value;
}
else
{
_object2 = value;
}
}
}
private void Update()
{
_usingMethod1 = true;
SomeProperty = FooMethod();
//..
_usingMethod1 = false;
}
Update
メソッドで; プロパティを取得または設定する前に、_usingMethod1 = true
ステートメントは常に実行されますか?または再注文の問題により、それを保証することはできませんか?私たちは
volatile
のように使用する必要がありますprivate volatile bool _usingMethod1 = false;
canを使用
lock;
すると、ロック内のすべてのステートメントが次のような順序で実行されることが保証されます。private void FooMethod() { object locker = new object(); lock (locker) { x = 1; y = a; i++; } }