2009-08-14 26 views
1

我想要一個通用的線程安全集合,並且我看到Arraylist可以很容易地通過其靜態Synchronized方法使用線程安全,但是我錯誤的是這個ArrayList不是通用的,所以當我想要使用我的對象時,我總是有投它們。有沒有更簡單的方法來做到這一點?其他列表類型也是可能的。線程安全和通用數組列表?

+0

是的,我可以包裝ArrayList或許任何其他解決方案? :) – 2009-08-14 14:01:04

回答

3

一知半解是件危險的事;-)是的,你可以使用元騎士的建議,並使用SyncRoot,但你必須要小心 - 它不是萬能的。請參閱Microsoft的BCL團隊博客中的this post,以瞭解爲什麼它不像SyncRoot那麼簡單。從該職位行情:

我們的一些通用 集合精明的用戶發現,我們不再 上 ICollection<T>

提供公共SyncRoot財產,我認爲我們'強迫 人更好地認爲 同步,坦率地說 SyncRoot我們的通用 集合上的屬性不提供任何價值。

當然,這並不是說它不能在任何情況下使用 - 您只需仔細考慮使用案例,而不是在自動駕駛中使用。

3

如果關於同步的方法在MSDN上閱讀仍然是這樣說:

「通過集合枚舉是本質上不是一個線程安全的過程即使一個集合已同步,其他線程仍可以修改該集合。 ,這會導致枚舉器拋出一個異常,爲了確保枚舉過程中的線程安全,您可以在整個枚舉過程中鎖定集合,或者捕獲其他線程所做更改導致的異常。

3

您可以創建一個List(T)包裝並與SyncRoot屬性同步訪問。

MSDN例如:

ICollection ic = ...; 
lock (ic.SyncRoot) 
{ 
    // Access the collection. 
}