Коллекции и синхронизация (потокобезопасность)
Обновлен: Ноябрь 2007
По умолчанию классы из пространства имен System.Collections и пространств имен, связанных с ним, не являются потокобезопасными. Чтение коллекции вполне может осуществляться несколькими потоками одновременно, но при любых изменениях коллекции все потоки, работающие с коллекцией, в том числе и потоки-читатели, получат неопределенный результат.
Классы пространства имен System.Collections можно сделать потокобезопасными любым из следующих способов:
Создание потокобезопасной оболочки с помощью метода Synchronized и работа с коллекцией исключительно через эту оболочку.
Если в классе нет метода Synchronized, то на его основе следует создать класс-наследник, реализовав в нем метод Synchronized с помощью свойства SyncRoot.
Использование такого механизма блокировки, как, например, оператор lock в языке C# (SyncLock в языке Visual Basic и класс Monitor в языке C++), для работы со свойством SyncRoot при обращении к коллекции.
При реализации метода Synchronized в классах-наследниках следует переопределять свойство IsReadOnly таким образом, чтобы оно возвращало правильное значение.
В классе Array отсутствует метод Synchronized и, хотя в нем есть свойство SyncRoot, наследовать от него нельзя. Таким образом, массив можно сделать потокобезопасным только с помощью механизма блокировки.
Универсальные классы коллекций не содержат элементов синхронизации; тем не менее, в некоторых универсальных классах, например, Collection<T>, Dictionary<TKey, TValue> и List<T>, в явной форме реализованы элементы синхронизации, унаследованные от неуниверсального интерфейса ICollection.
См. также
Ссылки
System.Collections.Specialized