2014-06-11 52 views
2

是可以安全使用以下方式在多線程場景:列表複製線程安全嗎?

var collecation = new List<T>(sharedCollection); 

其中sharedCollection可以在同一時間被另一個線程修改(即添加或刪除的元素從它)?

我目前正在處理的場景是從BindingList複製項目,但問題應該是相對於任何標準的集合類型。

如果不是線程安全的,我應該在sharedCollection上加鎖還是有更好的解決方案?

+9

_Nothing_約'名單'突變是線程安全的。 – SLaks

回答

3

您似乎已經回答了您自己的問題。不,將更改列表複製到另一個列表不是線程安全的,是的,您可以鎖定sharedCollection。請注意,在複製時鎖定sharedCollection是不夠的;您需要在閱讀或更改其內容時隨時鎖定它。

編輯:只是一個約時,它的鎖定你正在修改的對象注意 - 如果對象引用本身是可以改變的(比如`sharedCollection =新的列表),或者如果它可以爲null,則讓一個單獨的對象作爲發生閱讀/寫作的類的成員進行鎖定。

+0

我希望收集副本是線程安全的,所以不需要鎖定。在這種情況下,我將在GUI線程上創建列表副本以避免鎖定。 –

+1

@AlexanderPope,''sharedCollection'可以在後臺線程修改,而你正在GUI線程上覆制它?如果是這樣,你仍然不是線程安全的。你要麼確保列表只被一個線程使用,要麼一路鎖定...... – adv12

+0

不,用例是根據某些標準從綁定中刪除項目,並且爲此,我需要要迭代的綁定列表的副本。我不喜歡在gui主題上製作副本的想法,但這似乎是最乾淨的方式。我知道鎖定集合可能會導致死鎖,但我想盡可能地提出問題的基本原則。 –