2011-09-19 32 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