Потокобезопасные коллекции in.NET
Что является стандартом в настоящее время, когда требуется потокобезопасная коллекция (например, набор). Синхронизирую ли я его сам, или есть ли изначально потокобезопасная коллекция?
4 ответа:
Pre .net 4.0 большинство коллекций в .Net не являются потокобезопасными. Вам придется сделать некоторую работу самостоятельно, чтобы справиться с синхронизацией:http://msdn.microsoft.com/en-us/library/573ths2x.aspx
цитата из статьи:
коллекции классов могут быть сделаны поток безопасное использование любого из следующих методы:
создать потокобезопасную оболочку с помощью Синхронизированный метод, и доступ сбор исключительно через это обертка.
Если класс не имеет Синхронизированный метод, производный от класс и реализовать синхронизированный метод с использованием свойства SyncRoot.
используйте механизм блокировки, например оператор блокировки в C# (SyncLock in Visual Basic), на SyncRoot свойство при доступе к коллекция.
Синхронизировать Корневое Свойство
Блокировка ЗаявлениемObject thisLock = new Object(); ...... lock (thisLock) { // Critical code section }
в .net версии 4.0 в представил
в дополнение к очень полезным классам в
System.Collections.Concurrent
, один стандартный метод в сценариях в основном-чтение-редко-изменение (или если есть, однако, частые, но не параллельные записи), который также применим к .Net, называется копировать на запись.Он имеет несколько свойств, которые желательны в высококонкурентных программах:
- экземпляры объектов коллекции сами по себе неизменяемы (т. е. потокобезопасны, могут быть безопасно перечислены без блокировки)
- модификация может занять столько времени, сколько она хочет, производительность и параллелизм чтения не влияют
- может быть реализовано в общем превратить любую структуру данных, которая не является потокобезопасным в
ограничение: если есть параллельные записи, изменения, возможно, придется повторить, так что чем больше параллельных записей получить, тем менее эффективным он становится. (Это оптимистичного параллелизма at работа)
Edit