我知道這個話題已經被打砸了,因爲我已經閱讀了SO和其他地方的帖子的帖子,但我還沒有找到一個明確的答案,所以我道歉,如果你是被這種看似冗餘的感覺所感染。一次寫多次鎖
我有一種情況,有一次寫入,讀取百萬資源。該資源的創建非常昂貴,並且寫入鎖的爭用也可能非常高。此外,我無法預測它將運行在哪個處理器上,所以我不知道內存模型將在下面。我正在編譯.NET 3.5,.NET 4.0和Mono 2.10中構建的程序集的3個版本。
由於對資源的高度爭用,我需要儘可能提高效率,並且希望至少在讀取時使用無鎖模式。我理解用於創建資源的雙重鎖定檢查模式,但是由於_resource訪問內存障礙之外,它是否工作(在所有處理器上)存在分歧。我需要在_resource字段上使用volatile嗎? ReaderWriterLockSlim更適合這種情況嗎?我應該問什麼其他問題?
if(_resource == null)
{
lock(_locker)
{
if(_resource == null)
{
//create resource here...
}
}
}
此外,還會有許多這樣的:
if(_resource == null)
{
return _resourceDefault;
}
return _resource.GetSomething();
爲什麼還要在這裏鎖定? – leppie 2012-07-16 12:11:59
由於創建資源非常昂貴,我不能讓它多做一次。它包括跟蹤連接的服務器的遠程通信。 – 2012-07-16 12:41:17
好吧,早在線程開始閱讀之前就已經完成了。不需要鎖。這一切都太模糊,不能給出具體的建議。 – 2012-07-16 13:58:58