2014-09-05 90 views
0

當我有這樣的代碼:是List <T>(列表<T>)構造函數線程安全嗎?

public static List<Module> ExtensionList 
{ 
    get 
    { 
     return new List<Module>(Extensions); 
    } 
} 

是線程安全的?例如。它是否在Extensions上發行鎖定,並複製列表?或者我應該明確地做到這一點:

public static List<Module> ExtensionList 
{ 
    get 
    { 
     lock (Extensions) 
     { 
      return new List<Module>(Extensions); 
     } 
    } 
} 
+2

號根據MSDN,在'名單所有非靜態成員'不guarraned是線程安全的:「公共靜態(共享在Visual Basic中)這種類型的成員是線程安全的。任何實例成員不保證是線程安全的。「更多:http://msdn.microsoft.com/pl-pl/library/6sh2ey19(v=vs.110).aspx – 2014-09-05 07:41:21

+0

@pwas爲什麼這是一個不好的做法?你能詳細說明嗎?謝謝 – Petr 2014-09-05 07:51:45

回答

4

MSDN明確指出,沒有List<T>方法是線程安全的:

所有實例成員不能保證線程安全的。

對List執行多個讀取操作是安全的,但如果在讀取集合時被修改,則會發生問題。

構造函數本身總是線程安全的:您不能從另一個實例調用它。

如果用其他List<T>提供您List<T>構造,就像你在你的代碼做的,這是不是安全的,因爲進入List<T>可能同時通過構造函數(然後上述規則適用)正在處理改變。

+0

我可以批准這一點。我只是反映了.NET代碼,沒有鎖定語句,監視器或其他相關的東西。 – feO2x 2014-09-05 07:45:04

+1

但這是鍋爐板文本,這裏幾乎不重要。這很難(不可能?)使用多線程的構造函數。問題是關於參數。 – 2014-09-05 07:46:03

+0

@HenkHolterman:答案正確嗎?我清楚地指出,如果列表被用作傳入參數,它是不安全的。如果調用無參數構造函數,它是安全的。 – 2014-09-05 07:46:31

1

即使您將構造函數設置爲鎖定語句,該列表的用法也不會是線程安全的。

使用一個線程安全的集合像BlockingCollection

http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx

+0

編號線程安全的集合簡化語法 - 我們不需要使用'lock'或任何方法來鎖定。但正確使用'lock'可以爲任何操作提供線程安全性。 – 2014-09-05 07:48:16

+0

Axdorph是正確的,第二個帶'lock()'的樣本本身並不能保證線程安全。正確性取決於訪問擴展的其他代碼。 – 2014-09-05 07:49:40

+0

@Ok - 對,外面的課也必須正確使用鎖。 – 2014-09-05 07:51:09

相關問題