列出<t>并发删除和添加</t>

时间:2009-11-28 19:40:36

标签: c# .net list concurrency

我不太确定,所以我想我会问。将项目删除和添加到System.Collections.Generic.List<>对象是否是非线程安全的?

我的情况:

当收到连接时,它会被添加到列表中,但同时也会有一个正在删除死连接的工作人员。

有问题吗? lock会这样做吗? 我还想知道我是否可以使用Foreach<>方法对列表对象使用锁。

5 个答案:

答案 0 :(得分:29)

是的,在List<>中添加和删除项目不是线程安全的,因此您需要同步访问权限,例如使用lock

请注意lock关键字不会锁定您用作标识符的对象,它只会阻止两个线程同时输入相同的代码块。您将需要使用相同的对象作为标识符来访问列表的所有代码周围的锁。

答案 1 :(得分:4)

在提出问题时还没有.NET Framework 4,但现在遇到问题的人应该尝试使用 System.Collections.Concurrent 命名空间中的集合进行处理线程安全问题

答案 2 :(得分:2)

List<T>不是线程安全的,所以是的,您需要使用锁来控制对列表的访问。如果您有多个线程访问列表,请确保您拥有它们都尊重锁定,否则您将遇到问题。执行此操作的最佳方法是将List子类化,以便锁定自动发生,否则最终可能最终会忘记锁定。

答案 3 :(得分:-1)

实际上,有时List&lt;&gt;根据{{​​3}}:

,它是线程安全的,有时不是
  

此类型的公共静态成员是   线程安全。任何实例成员都是   不保证是线程安全的。

但该页继续说:

  

通过集合枚举是   本质上不是线程安全的   程序。在罕见的情况下   枚举与一个或多个竞争   写访问,唯一的方法来确保   线程安全是锁定   整个收集   列举。允许收集   由多个线程访问   读书和写作,你必须   实现自己的同步。

答案 4 :(得分:-1)

肯定对特定代码使用锁使其线程安全,但我不同意它对于当前场景。

您可以实现Synchronized方法以使收集线程安全。这个link解释了为什么以及如何做到这一点。

这个link中提到了另一种纯粹的程序化方法,虽然我从未对它进行过第一手测试,但它应该可行。

顺便说一下,最重要的一个问题是,你是否试图维护连接池之类的东西?如果是,那么为什么?

我接受了我的回答。使用锁定更好地回答使用此方法。