以下伪代码是线程安全的吗?
IList<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
列表永远不会被改变,只是并行地进行迭代和读取。没有对字段进行任何写入操作或类似的操作。
谢谢。
以下伪代码是线程安全的吗?
IList<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
列表永远不会被改变,只是并行地进行迭代和读取。没有对字段进行任何写入操作或类似的操作。
谢谢。
是的,List<T>
在多个线程同时读取时是可以的,只要没有写入操作。
根据文档:
List<T>
可以支持多个读取者并发访问,只要集合不被修改。
编辑:请注意,您的代码不一定使用 List<T>
- 只是一个 IList<T>
。您知道 GetData()
返回的类型吗?如果您对 GetData()
有控制权,那么您可能需要记录返回的列表在读取时是线程安全的,如果它实际上返回的是 List<T>
。
DoSomething(item)
不修改dataList
,它就是完全线程安全的。既然您说没有修改,那么它是线程安全的。IEnumerable
访问它。IEnumerable<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
List<T>
,那就是一个问题,我怀疑仅仅是“查找”是一个问题。 - Jon Skeet