【问题标题】:Is ICollection<>.Add() thread safe?ICollection<>.Add() 线程安全吗?
【发布时间】: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&lt;&gt;.Add() 或任何其他实现ICollection&lt;&gt;.Add() 的类在内部处理任何竞争条件还是需要明确处理?如果是那怎么办?

【问题讨论】:

  • ICollection&lt;T&gt; 是一个接口。该接口的具体实现可能是线程安全的,也可能不是,但谈论接口本身的线程安全性并没有真正意义。问题应该是List&lt;T&gt;.Add() 是否是线程安全的。
  • System.Collections.Generic中的集合类不提供任何线程同步;当在多个线程上同时添加或删除项目时,用户代码必须提供所有同步。如果您需要线程安全,请查看 System.Collections.Concurrent 命名空间。 msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx
  • 列表不是线程安全的。这在class's documentationThread Safety 部分中提到。此部分出现在 所有 .NET 类 的文档中

标签: c# collections concurrency thread-safety


【解决方案1】:

ICollection 没有任何内部结构;这是一个界面。实现可能是线程安全的,也可能不是线程安全的,但接口并不能保证任何事情。

这可能很有用:

http://msdn.microsoft.com/en-us/library/dd997305%28v=vs.110%29.aspx

【讨论】:

  • 看来 OP 会知道 ICollection&lt;T&gt; 是一个接口,这就是 OP 提供示例代码的原因:Property = new List&lt;MyClass&gt;();
  • @MatíasFidemraizer 也许,但问题(在编辑之前)专门询问 ICollection 如何处理竞争条件。
【解决方案2】:

您需要明确地处理并发。这就是为什么有一个命名空间called System.Concurrent.Collections

如果顺序无关紧要,you might need to take a look to ConcurrentBag&lt;T&gt;. 否则,您需要提供自己的实现或派生类来为@987654326 中的任何开箱即用的ICollection&lt;T&gt; 实现提供线程安全性@命名空间。

【讨论】:

    【解决方案3】:

    您的具体类型是List&lt;MyClass&gt;,因此您应该查看List&lt;T&gt;.Add 的线程安全性,记录在List(T) Class

    线程安全

    此类型的

    公共静态(Visual Basic 中为 Shared)成员是线程安全的。不保证任何实例成员都是线程安全的。

    对 List 执行多个读取操作是安全的,但如果在读取集合时修改了集合,则可能会出现问题。为确保线程安全,请在读取或写入操作期间锁定集合。要使一个集合能够被多个线程访问以进行读写,您必须实现自己的同步。对于具有内置同步的集合,请参阅 System.Collections.Concurrent 命名空间中的类。有关固有的线程安全替代方案,请参阅 ImmutableList 类。

    所以不,在您的具体示例中,它不是线程安全的,但可以通过使用不同的集合类型使其成为线程安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      • 2010-12-27
      相关资源
      最近更新 更多