以下伪代码是否是线程安全的?
IList<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
列表永远不会改变,它只是迭代并且并行读取。不写字段或类似的东西。
感谢。
答案 0 :(得分:44)
是的,List<T>
可以同时从多个线程读取,只要没有写入。
只要未修改集合,
List<T>
可以同时支持多个阅读器。
编辑:请注意,您的代码必然使用List<T>
- 只需IList<T>
。你知道GetData()
返回的类型吗?如果您控制GetData()
,您可能希望记录它返回的列表是否可以线程安全地读取,如果它实际返回List<T>
。
答案 1 :(得分:3)
只要DoSomething(item)
不修改dataList
,它就完全是线程安全的。既然你说它没有,那么是的,这是线程安全的。
答案 2 :(得分:1)
确保没有人会更改您的列表,您可以通过IEnumerable
访问它IEnumerable<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
答案 3 :(得分:0)
如果你说的是正确的那么我会这样说。但你所说或所想的可能不是现实中发生的事情。你怎么能在代码中说出你所说的话。如何强制执行List永远不会被修改的约束?