Поделиться через


Коллекции и синхронизация (потокобезопасность)

Обновлен: Ноябрь 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

System.Collections.Specialized

System.Collections.Generic

Другие ресурсы

Управление коллекциями и их создание