Что является стандартом в наше время, когда каждому нужен ориентированный на многопотоковое исполнение набор (например, Набор). Я синхронизирую его сам, или есть ли по сути ориентированный на многопотоковое исполнение набор?
В .NET 4.0 Framework представлено несколько потокобезопасных коллекций в пространстве имен System.Collections.Concurrent:
ConcurrentBag
Представляет потокобезопасную неупорядоченную коллекцию объектов.ConcurrentDictionary
Представляет потокобезопасную коллекцию пар ключ-значение, к которой могут одновременно обращаться несколько потоков.ConcurrentQueue
Представляет потокобезопасную коллекцию типа "первый вошел - первый вышел" (FIFO).ConcurrentStack
Представляет собой потокобезопасную коллекцию "последний вошел-первый вышел" (LIFO).
Другие коллекции в .NET Framework по умолчанию не являются потокобезопасными и требуют блокировки для каждой операции:
lock (mySet)
{
mySet.Add("Hello World");
}
До .net 4.0 большинство коллекций в .Net не являются потокобезопасными. Вам придется проделать некоторую работу самостоятельно, чтобы справиться с синхронизацией: http://msdn.microsoft.com/en-us/library/573ths2x.aspx
Цитата из статьи:
Классы коллекций можно сделать потокобезопасными. безопасными, используя любой из следующих методов:
Создайте потокобезопасную обертку с помощью метода Synchronized, и получить доступ к коллекции исключительно через эту обертку.
Если класс не имеет Synchronized, создайте производную от класса и реализуйте метод Synchronized метод, используя свойство SyncRoot.
Используйте механизм блокировки, такой как оператор блокировки в C# (SyncLock в Visual Basic), на свойстве SyncRoot при доступе к коллекции.
Свойство Sync Root
Оператор блокировки
Object thisLock = new Object();
......
lock (thisLock)
{
// Critical code section
}
В .net 4.0 появилось пространство имен System.Collections.Concurrent
Blocking Collection
Concurrent Bag
Concurrent Queue
Concurrent Dictionary
Ordable Partitioner
Partitioner
Partitioner T
.NET 4 предоставляет набор потокобезопасных коллекций в System.Collections.Concurrent