2014-02-16 3 views
1

Действительно ли он потокобезопасен для получения элемента по индексу из списка?Действительно ли это потокобезопасно получить элемент по индексу из списка

var list = new List<int>(); 
... 
var a = list[i]; //executed from multiple threads. Should this be protected? 
+2

Это зависит от реализации списка, в основном. 'ArrayList' не является потокобезопасным,' CopyOnWriteArrayList' является ... –

+1

Если вы только получаете элементы из списка, то его ОК. Если вы также меняете список (установка, добавление, удаление), вы должны блокировать сбор –

+1

Это зависит от того, что вы делаете. Параллельные _reads_ в порядке. – SLaks

ответ

5

Это абсолютно поточно ... ... до тех пор, как вы можете убедиться, что список не изменяется. Даже добавление элементов приводит вас к «неопределенной» территории (хотя в зависимости от реализации она может просто работать).

Итак, только для чтения - да. Чтение + манипуляция: нет.

Примечание: это нормально менять элементы в lsit, если список [5], например, является одним и тем же объектом. В списке все равно. Не сказать, что это сработает - потому что в зависимости от того, что вы измените здесь, это будет ваш контракт с объектами в списке. Для ints вам явно не нужно их обновлять.

1

Это зависит от того, какое действие вы хотите предпринять.

Читать полностью.

записи/Edit - не так безопасно

Есть несколько коллекций, отнесенных к категории Concurrent Collections, которые поточно из коробки.

Но, быстрее (во время выполнения) синхронизировать существующий List<T>, а затем использовать параллельную коллекцию.

Смежные вопросы