在.NET中,通用列表(generic.list)和通用字典(generic.dictionary)是否是线程安全的?

6

5
除非有明确的文档说明,否则假设一个类不是线程安全的。 - millimoose
2个回答

10

不,它们不是线程安全的(如果没有进行自己的锁定)。

请使用其中一个Concurrent集合。

线程安全集合

System.Collections.Concurrent命名空间提供了几个线程安全的集合类,应该在多个线程同时访问集合时,使用这些类来替换System.Collections和System.Collections.Generic命名空间中对应的类型。


http://blogs.msdn.com/b/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx - Mitch Wheat

3
整个 List<T> 类的文档中,有关线程安全的一节如下所示:

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


1
尽管如此,这是几乎每个(如果不是每个).NET类型上的样板文件文档。 - Adam Robinson
指出得好。这就解释了为什么没有concurentList。List已经是并发的了。+1 - user4951
实际上不是这样的。没有任何指示它是线程安全的。列表似乎不包含任何静态方法。 - user4951
1
@JimThio 这不是文档的意思。它的意思是,如果List静态方法,它们将是线程安全的,因为它们不会更改任何全局状态。在没有同步的情况下共享List实例是不安全的,因为您始终需要调用它们的实例方法才能使用它们。 - millimoose
@JimThio 你需要寻找 SynchronizedCollection<T> - millimoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接