2010-11-01 59 views
12

大家都用很多List。我需要遍歷這個列表,所以我使用已知的SyncRoot模式。列表<T>未實現SyncRoot!

最近我在this的帖子中發現應該避免使用SyncRoot來支持「嵌入」線程安全(每種方法都會鎖定一個私有對象,而不用使用SyncRoot屬性來暴露它)。我能理解它,部分我同意這一點。

的問題是,List<T>類沒有實現SyncRoot屬性,即使實現了ICollection接口,它暴露SyncRoot上財產。我說這bause代碼

List<int> list = new List<int>() 
list.SyncRoot; 

給我下面的編譯器錯誤:

error CS0117: 'System.Collections.Generic.List' does not contain a definition for 'SyncRoot'

...如果這是真的,我怎麼能進行遍歷時,同步類型列表<牛逼>的公共屬性超過它?

+1

我從來沒有發現SyncRoot在現實生活中能夠很好地工作,因爲鎖定在更高級別上往往更好,而不是鎖定單個集合 – 2010-11-01 09:04:09

回答

18

它實際上是明確實施的。

object ICollection.SyncRoot 
{ 
    get 
    { 
     if (this._syncRoot == null) 
     { 
      Interlocked.CompareExchange(ref this._syncRoot, new object(), null); 
     } 
     return this._syncRoot; 
    } 
} 

這意味着你必須投入到ICollection以使用它。

+1

好極了,它是正確的。我不知道明確的實現,謝謝。 – Luca 2010-11-01 08:01:38

+0

即使在我自己的類上有明確的SyncRoot屬性實現可能是明智的嗎? (我有自定義的集合實現)我認爲這可能會阻止SyncRoot的使用。 – Luca 2010-11-01 08:10:08

+3

由於這個原因,明確實施了SyncRoot,因此確實不鼓勵使用SyncRoot。我發現實現成員明確有用,特別是在兩種情況下:1.成員的使用在接口之外沒有用處(例如參見這個例子:http://bit.ly/crLXAz)2.成員尚未實現並拋出一個異常(參見這個例子http://bit.ly/3RFzn4,其中'Add'方法對'ReadOnlyDictionary'沒有意義)。 – Steven 2010-11-01 08:17:38