Является ли List <T> потокобезопасным для чтения?
Является ли следующий псевдокод потокобезопасным?
IList<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
Список никогда не изменяется, он только повторяется и читается параллельно. Нет записи в поля или что-то в этом роде.
Спасибо.
Ответы
Ответ 1
Да, List<T>
отлично читать из нескольких потоков одновременно, пока ничего не записывается.
Из документации:
A List<T>
может поддерживать несколько считывателей одновременно, пока сбор не изменяется.
EDIT: Обратите внимание, что ваш код не обязательно использует List<T>
- только a IList<T>
. Вы знаете тип, возвращаемый GetData()
? Если вы контролируете GetData()
, вы, вероятно, захотите документировать, что возвращаемый им список является потокобезопасным для чтения, если он фактически возвращает List<T>
.
Ответ 2
Он полностью потокобезопасен, пока DoSomething(item)
не изменяет dataList
. Поскольку вы сказали, что это не так, тогда да, это поточно-безопасный.
Ответ 3
чтобы убедиться, что никто не изменит список yuor, вы можете получить к нему доступ через IEnumerable
IEnumerable<T> dataList = SomeNhibernateRepository.GetData();
Parallel.For(..i..)
{
foreach(var item in dataList)
{
DoSomething(item);
}
}
Ответ 4
Если вы скажете прав, я бы так сказал. Но то, что вы говорите или думаете, не может произойти в действительности. Как вы можете сказать в коде, что вы сказали. Как принудительно использовать ограничение, которое никогда не будет изменено в списке?