2010-12-08 57 views
1

我很困惑自己正在閱讀關於Lazy <T>(bool)構造函數的微軟文檔。懶惰<T>(布爾型)構造函數文檔

參數被描述爲:

isThreadSafe:真由多個線程,使這個實例可用同時;爲了使該實例一次只能由一個線程使用,爲false。

如果我將在訪問通常寫的代碼是:

If _rulesCache Is Nothing Then 

    SyncLock (_lockRulesCache) 

     If _rulesCache Is Nothing Then 

      _rulesCache = New RulesCache() 

     End If 

    End SyncLock 

End If 

Return _rulesCache 

做我想做的懶惰型的構造函數使用真或假?

Private _rulesCache As New Lazy(Of RulesCache)(**?**) 

所以我的訪問者變爲:

Return _rulesCache.Value 

1)一旦對象被創建,它可以在內部處理多個線程訪問。

2)我只需要確保如果有多個線程同時接近訪問器並且對象不存在,那麼它只會被創建一次。

根據文檔,語句1意味着該參數應該是false。陳述2意味着該參數應該是真實的。

我覺得我過度思考這一點,這只是讓我更加困惑。或者上面的兩個聲明實際上彼此不一致,我應該堅持手動鎖定來管理對象實例化?

回答

2

聲明2是所需的解釋。在延遲初始化完成後,該參數不會影響對象的任何行爲;它只能防止兩個線程意外地競賽並實例化它兩次。如果你好奇,你可以驗證Reflector。

+0

因此,我應該解釋isThreadSafe值,看看Lazy實例是否應該期望並處理嘗試同時實例化它的多個線程(true),或者如果它正在單線程環境中使用,它可以使用僅針對優化的代碼一個線程實例化它(false)。是? – ulty4life 2010-12-08 04:06:03