【发布时间】:2014-09-04 10:03:35
【问题描述】:
我有如下收藏?
public ICollection<MyClass> Property { get; private set; }
...
Property = new List<MyClass>();
我希望在从数据库中获取每个 MyClass 项目后将 MyClass 项目添加到 Property 中。现在每个数据库获取都在单独的后台线程中处理,并且它们同时运行。因此,来自 DB 调用的每个返回值都将面临Property.Add()。现在这可能会导致竞争条件,因为Property.Add() 可能会在一个瞬间被多次调用。
所以我的问题是List<>.Add() 或任何其他实现ICollection<>.Add() 的类在内部处理任何竞争条件还是需要明确处理?如果是那怎么办?
【问题讨论】:
-
ICollection<T>是一个接口。该接口的具体实现可能是线程安全的,也可能不是,但谈论接口本身的线程安全性并没有真正意义。问题应该是List<T>.Add()是否是线程安全的。 -
System.Collections.Generic中的集合类不提供任何线程同步;当在多个线程上同时添加或删除项目时,用户代码必须提供所有同步。如果您需要线程安全,请查看System.Collections.Concurrent命名空间。 msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx -
列表不是线程安全的。这在class's documentation 的
Thread Safety部分中提到。此部分出现在 所有 .NET 类 的文档中
标签: c# collections concurrency thread-safety