Is List<T> thread-safe for reading?
Is the following pseudocod开发者_StackOverflowe thread-safe ?
IList<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
The list never gets changed, it's only iterated and read in parallel. No writing to fields or something like that whatsoever.
Thanks.
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>
.
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.
To make sure no one is going to change your list, you could access it through an IEnumerable
IEnumerable<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
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?
精彩评论