【问题标题】:What is the difference between SynchronizedCollection<T> and the other concurrent collections?SynchronizedCollection<T> 和其他并发集合有什么区别?
【发布时间】:2011-01-11 07:20:31
【问题描述】:

SynchronizedCollection&lt;T&gt;System.Collections.Concurrent 命名空间中的并发集合有何不同,除了并发集合是命名空间和 SynchronizedCollection&lt;T&gt; 是类之外?

SynchronizedCollection&lt;T&gt; 和并发集合中的所有类都提供线程安全的集合。我如何决定何时使用其中一种,为什么?

【问题讨论】:

标签: c# collections .net-4.0 thread-safety concurrent-collections


【解决方案1】:

SynchronizedCollection&lt;T&gt; 类首先在 .NET 2.0 中引入,以提供线程安全的集合类。它通过锁定来实现这一点,因此您基本上拥有一个List&lt;T&gt;,其中每个访问都包含在lock 语句中。

System.Collections.Concurrent 命名空间要新得多。直到 .NET 4.0 才引入它,它包括一组经过显着改进和更多样化的选择。这些类不再使用锁来提供线程安全,这意味着它们应该在多个线程同时访问其数据的情况下更好地扩展。但是,这些选项中明显没有实现IList&lt;T&gt; 接口的类。

因此,如果您的目标是 .NET Framework 4.0 版,则应尽可能使用System.Collections.Concurrent 命名空间提供的集合之一。就像在System.Collections.Generic namespace 中提供的各种类型的集合之间进行选择一样,您需要选择其特性和特性最适合您的特定需求的集合。

如果您的目标是较旧版本的 .NET Framework 或需要实现 IList&lt;T&gt; 接口的集合类,则必须选择 SynchronizedCollection&lt;T&gt; 类。

MSDN上的这篇文章也值得一读:When to Use a Thread-Safe Collection

【讨论】:

  • 如果这些新的并发集合不使用锁来保证线程安全,那么并发是如何实现的?
  • @Matt:各种方式。答案可能足够复杂,以至于值得提出自己的问题。但是为了获得灵感,请看这里:stackoverflow.com/questions/1688870/… 和这里:stackoverflow.com/questions/4785622/…(另外,你读过我链接到的 MSDN 文章吗?它非常简短地总结了他们使用的技巧而不是锁定,尽管可能不足以编写你自己的实现。)
  • 感谢您的信息。那是阅读我什至不知道存在于 .NET 中的东西的一个好小时左右(但仍然不完全理解)
  • @Matt,.NET4 并发类使用 SpinWait 对象来解决线程安全问题,而不是 Monitor.Enter/Exit(又名关键部分)。不同之处在于 SpinWait 结构尝试保持线程运行并等待信号继续,而关键部分执行 yield(也称为线程上下文切换),然后定期返回线程并检查它是否可以继续. CS 很快,但在某些情况下,如果受保护的代码执行得很快,SpinWait 会带来更好的性能。
  • 据我所知,今天仍然没有并发的 IList 替代方案。在 ConcurrentBag 中,您不能真正删除项目。一些文章建议(ab-)使用 ConcurrentDictionary,由于它不必要的开销,我觉得这很烦人。所以我自己一直在使用 SynchronizedCollection。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2021-05-06
相关资源
最近更新 更多