我最近閱讀關於內存障礙和重新排序問題,現在我對它有一些困惑。鎖定語句的內存屏障
考慮以下情形:
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++; } }
感謝您的信息,它真的幫助我更多地理解這個概念。我需要的是確保「_usingMethod1 = true」指令將在下一條指令SomeProperty = FooMethod()之前完成。在多線程塞加里奧如何實現這一目標?是通過:_usingMethod1 = true; Thread.MemoryBarrier(); SomeProperty = FooMethod();或鎖定完整的柵欄,所以沒有reordaring:lock(locker){_usingMethod1 = true; } SomeProperty = FooMethod();或者可能只是通過使_usingMethod1成爲一個易變的變量。謝謝你的幫助。 – 2010-05-17 08:59:38
我會將Update方法的全部內容封裝在一個鎖中。除了記憶障礙之外,它還保證原子性,這同樣重要。另外,這些無鎖定的習慣用法(通過volatile,Thread.MemoryBarrier等)難以想象。 – 2010-05-17 13:25:25