List 是否可以读取线程安全?

以下伪代码是否是线程安全的?

IList dataList = SomeNhibernateRepository.GetData(); Parallel.For(..i..) { foreach(var item in dataList) { DoSomething(item); } } 

列表永远不会被更改,它只是迭代并且并行读取。 没有写字段或类似的东西。

谢谢。

是的, List可以同时从多个线程读取,只要没有写入。

从文档 :

List可以同时支持多个读者,只要不修改集合即可。

编辑:请注意,您的代码不一定使用List – 只是一个IList 。 你知道GetData()返回的类型吗? 如果你控制GetData()你可能想要记录它返回的列表是否是线程安全的,如果它实际上返回了List

只要DoSomething(item)不修改dataList完全是线程安全的。 既然你说它没有,那么是的,这是线程安全的。

为了确保没有人会改变您的名单,您可以通过IEnumerable访问它

 IEnumerable dataList = SomeNhibernateRepository.GetData(); Parallel.For(..i..) { foreach(var item in dataList) { DoSomething(item); } } 

如果你说的是正确的那么我会这么说。 但你所说或所想的可能不是现实中发生的事情。 你怎么能在代码中说出你所说的话。 如何强制执行List永远不会被修改的约束?