最近我了解了关于内存屏障和重排序问题的知识,现在我对此有些困惑。
考虑以下情况:
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++;
}
}