为什么 C# 中没有并发集合?
2022-09-03 08:37:59
我试图大致了解C#中集合背后的线程安全理论。
为什么没有 Java 中的并发集合?(java docs).有些集合看起来是线程安全的,但我不清楚位置是什么,例如:
- 复合操作,
- 使用迭代器的安全性,
- 写入操作
我不想重新发明轮子!(我不是多线程大师,绝对不会低估这有多难)。
我希望社区可以提供帮助。
我试图大致了解C#中集合背后的线程安全理论。
为什么没有 Java 中的并发集合?(java docs).有些集合看起来是线程安全的,但我不清楚位置是什么,例如:
我不想重新发明轮子!(我不是多线程大师,绝对不会低估这有多难)。
我希望社区可以提供帮助。
到目前为止,.NET一直具有相对“低级”的并发支持 - 但是.NET 4.0引入了System.Collections.Concurrent
命名空间,其中包含各种安全且有用的集合。
Andrew 的答案在如何处理 .NET 4.0 之前的集合方面是完全正确的 - 对于大多数用途,我只是在访问“正常”共享集合时适当地锁定。但是,并发集合使使用生产者/使用者队列等变得容易。
C# 提供了多种方式来处理跨多个线程的集合。为了更好地编写这些技术,我建议您从集合和同步(线程安全)开始:
默认情况下,集合类通常不是线程安全的。多个读者可以放心地阅读该馆藏;但是,对集合的任何修改都会为访问集合的所有线程(包括读取器线程)生成未定义的结果。
可以使用以下任一方法使集合类成为线程安全的:
- 使用 Sync 方法创建线程安全包装器,并通过该包装器以独占方式访问集合。
- 如果该类没有 Sync 方法,请从该类派生并使用 SyncRoot 属性实现一个 Sync 方法。
- 访问集合时,请在 SyncRoot 属性上使用锁定机制,如 C# 中的 lock 语句(Visual Basic 中的 SyncLock)。