2011-09-19 34 views
-1

.Net List類不是線程安全的。我希望實現所需的最小鎖定,但仍然滿足這樣的要求,即對於閱讀,幻像記錄是允許的,並且對於書寫,它們必須是線程安全的,因此不會有任何丟失的更新。.NET List線程安全實現需要提出的建議

所以我有類似

public static List<string> list = new List<string>(); 

In Methods that have **List.Add**/**List.Remove** , I always lock to assure thread safety 

      lock (lockHelper) 
      { 
        list.Add(obj); 
        or list.Remove(obj); 
      } 

In Methods that requires **List Reading** I don't care about phantom record so I go ahead to read without any locking. In this case. Return a bool by checking whether a string had been added. 

      if (list.Count() != 0) { 
       return list.Contains("some string") 
      } 

我所做的只是鎖定寫訪問,並允許訪問讀取要經過沒有任何鎖定。我的線程安全主意是否有效?

我明白有列表大小擴展。它會好嗎?我的猜測是,當一個List正在擴展時,它可能會使用一個temp。名單。這是可以的,因爲臨時列表大小將總是有一個邊界,並且.Net類很好地實現,即。在更新中發現讀取時,不應該有任何indexOutOfBound或循環引用問題。

+1

您使用哪個.NET版本的線程安全集合? – msarchet

+0

microsoft .net v4.0 – Bamboo

回答

3

不,這不安全。您應該防止讀取和枚舉。

由於您使用的是4.0,請查看新的線程安全集合。

http://msdn.microsoft.com/en-us/library/dd997305.aspx

+0

如果我使用我自己的impl。的枚舉,而不是由.net提供的那個(在列表被修改時拋出異常)像這樣。 http://refactormycode.com/codes/945-cached-ienumerable-t 它現在是線程安全的嗎? – Bamboo

+1

它的很多額外的工作,特別是因爲.NET現在給你這些。 –

1

由於您使用的是.NET 4.0,因此應該使用ConcurrentBag<T>,因爲它提供了UnorderedList的線程安全實現。

你可以看到一切都在這裏

.NET Thread Safe Collections