我不太确定,所以我想我会问。将项目删除和添加到System.Collections.Generic.List<>
对象是否是非线程安全的?
我的情况:
当收到连接时,它会被添加到列表中,但同时也会有一个正在删除死连接的工作人员。
有问题吗? lock
会这样做吗?
我还想知道我是否可以使用Foreach<>
方法对列表对象使用锁。
答案 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)