List< T>线程安全的读取
本文关键字:安全 读取 线程 List | 更新日期: 2023-09-27 18:04:49
以下伪代码是线程安全的吗?
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);
}
}
如果你说的是对的,那我就这么说。但你所说的或所想的可能与现实中发生的不一样。你怎么能用密码说你说过的话。如何强制列表永不修改的约束?