为什么 C# 中没有并发集合?

我试图大致了解C#中集合背后的线程安全理论。

为什么没有 Java 中的并发集合?(java docs).有些集合看起来是线程安全的,但我不清楚位置是什么,例如:

  • 复合操作,
  • 使用迭代器的安全性,
  • 写入操作

我不想重新发明轮子!(我不是多线程大师,绝对不会低估这有多难)。

我希望社区可以提供帮助。


答案 1

到目前为止,.NET一直具有相对“低级”的并发支持 - 但是.NET 4.0引入了System.Collections.Concurrent命名空间,其中包含各种安全且有用的集合。

Andrew 的答案在如何处理 .NET 4.0 之前的集合方面是完全正确的 - 对于大多数用途,我只是在访问“正常”共享集合时适当地锁定。但是,并发集合使使用生产者/使用者队列等变得容易。


答案 2

C# 提供了多种方式来处理跨多个线程的集合。为了更好地编写这些技术,我建议您从集合和同步(线程安全)开始

默认情况下,集合类通常不是线程安全的。多个读者可以放心地阅读该馆藏;但是,对集合的任何修改都会为访问集合的所有线程(包括读取器线程)生成未定义的结果。

可以使用以下任一方法使集合类成为线程安全的:

  • 使用 Sync 方法创建线程安全包装器,并通过该包装器以独占方式访问集合。
  • 如果该类没有 Sync 方法,请从该类派生并使用 SyncRoot 属性实现一个 Sync 方法。
  • 访问集合时,请在 SyncRoot 属性上使用锁定机制,如 C# 中的 lock 语句(Visual Basic 中的 SyncLock)。