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永远不会被修改的约束?