Is List thread-safe for reading?

后端 未结 4 1009
遥遥无期
遥遥无期 2020-12-17 08:08

Is the following pseudocode thread-safe ?

IList dataList = SomeNhibernateRepository.GetData();

Parallel.For(..i..)
{
    foreach(var item in dataLi         


        
相关标签:
4条回答
  • 2020-12-17 08:21

    It's fully thread-safe as long as DoSomething(item) doesn't modify dataList. Since you said it doesn't, then yes, that is thread-safe.

    0 讨论(0)
  • 2020-12-17 08:29

    If whay you say is correct then I would say so. But what you say or think may not what happen in reality. How can you say in code what you have said. How to enforce the constraint that List is never modified?

    0 讨论(0)
  • 2020-12-17 08:35

    to make sure no one is gonna change yuor list you could access it through an IEnumerable

    IEnumerable<T> dataList = SomeNhibernateRepository.GetData();
    
    Parallel.For(..i..)
    {
        foreach(var item in dataList)
        {
           DoSomething(item);
        }
    }
    
    0 讨论(0)
  • 2020-12-17 08:37

    Yes, List<T> is fine to read from multiple threads concurrently, so long as nothing's writing.

    From the documentation:

    A List<T> can support multiple readers concurrently, as long as the collection is not modified.

    EDIT: Note that your code doesn't necessarily use List<T> - just an IList<T>. Do you know the type returned by GetData()? If you're in control of GetData() you probably want to document that the list returned by it is thread-safe for reading, if it's actually returning a List<T>.

    0 讨论(0)
提交回复
热议问题