ICollection<>;.Add()线程安全
本文关键字:线程 安全 lt gt ICollection Add | 更新日期: 2023-09-27 18:20:41
我有一个集合,如下所示?
public ICollection<MyClass> Property { get; private set; }
...
Property = new List<MyClass>();
我希望在从DB获取每个MyClass
项目后,将MyClass
项目添加到Property
中。现在,每个DB提取都在单独的后台线程中处理,并且它们同时运行。因此,DB调用的每个返回值都将面对Property.Add()
。现在,这可能导致竞争条件,因为Property.Add()
可能在一瞬间被调用多次。
所以我的问题是List<>.Add()
或任何其他实现ICollection<>.Add()
的类在内部处理任何竞争条件还是需要显式处理?如果是,那怎么办?
ICollection没有任何内部结构;这是一个接口。实现可能是线程安全的,也可能不是,但接口不能保证任何东西。
这可能很有用:
http://msdn.microsoft.com/en-us/library/dd997305%28v=vs.110%29.aspx
您需要显式处理并发。这就是为什么有一个名为System.Concurrent.Collections
的名称空间。
如果订单无关紧要,您可能需要查看ConcurrentBag<T>
。否则,您将需要提供自己的实现或派生类,以便为System.Collections.Generic
命名空间中的任何现成的ICollection<T>
实现提供线程安全性。
您的具体类型是List<MyClass>
,因此您应该查看List<T>.Add
的线程安全性,记录在List(T)class:中
线程安全
此类型的公共静态(Visual Basic中的Shared)成员是线程安全的。任何实例成员都不能保证是线程安全的。
对List<T>,但是,如果在读取集合时对其进行了修改,则可能会出现问题。为确保线程安全,请在读取或写入操作期间锁定集合。要使多个线程能够访问集合进行读写,必须实现自己的同步。有关具有内置同步的集合,请参阅System.collections.Concurrent命名空间中的类。有关固有的线程安全替代方案,请参阅ImmutableList类。
所以不,在您的特定示例中,它不是线程安全的,但可以通过使用不同的集合类型来实现线程安全。