Недавно я прочитал о барьерах памяти и проблеме переупорядочения, и теперь у меня есть некоторое замешательство в этом.
Рассмотрим следующий сценарий:
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;
-
Если мы используем
lock;
, мы можем гарантировать, что каждый оператор в блокировке будет выполнен в следующем порядке:private void FooMethod() { object locker = new object(); lock (locker) { x = 1; y = a; i++; } }