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>可以支持多个并发读,只要不修改集合。

编辑:请注意,您的代码不一定使用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);
    }
}

如果你说的是对的,那我就这么说。但你所说的或所想的可能与现实中发生的不一样。你怎么能用密码说你说过的话。如何强制列表永不修改的约束?