Подтвердить что ты не робот

Является ли List <T> потокобезопасным для чтения?

Является ли следующий псевдокод потокобезопасным?

IList<T> dataList = SomeNhibernateRepository.GetData();

Parallel.For(..i..)
{
    foreach(var item in dataList)
    {
       DoSomething(item);
    }
}

Список никогда не изменяется, он только повторяется и читается параллельно. Нет записи в поля или что-то в этом роде.

Спасибо.

4b9b3361

Ответ 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

Если вы скажете прав, я бы так сказал. Но то, что вы говорите или думаете, не может произойти в действительности. Как вы можете сказать в коде, что вы сказали. Как принудительно использовать ограничение, которое никогда не будет изменено в списке?