List<T> 构造函数线程安全吗?

3
更具体地说,如果用于初始化列表的IEnumerable在构建新列表期间被修改,那么List(T)(IEnumerable(T))是否线程安全?
2个回答

6

这与List构造函数是否线程安全无关,它仅取决于IEnumerable是否线程安全。

构造函数不是线程安全的,但在这种情况下并不是问题。构造函数没有做任何会影响其线程安全性的事情,可能存在问题的是IEnumerable的线程安全性。


有一些特殊情况,但大多数构造函数自然而然地是“线程安全”的。这是因为其他线程通常无法在构造函数返回之前获取对象的引用。这个答案完全正确,因为它取决于特定的IEnumerable<T>实现。 - Jason Kresowaty
好的,我本来就怀疑是这样的,但我不太确定,因为我对List<T>(IEnumerable<T>)和List<T>.AddRange(IEnumerable<T>)进行了一些性能比较,前者似乎比后者表现更好。感谢您迅速的回答! - scim

1

这不完全取决于正在构建的列表,而是取决于正在迭代的特定 IEnumerable<T>这个 线程安全吗?如果它不支持并发迭代和编辑,则会出现异常(或更糟糕的是:不可预测的结果)。大多数 .NET 迭代器都不喜欢这样做;4.0 引入了更多的并发集合,或者您可以编写自己的。

如果成功创建了列表(迭代源),则一旦构建完成,原始列表就不再影响 - 两者是分离的。


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