Колекції, представлені в .NET Framework 1.0, можна знайти у просторі імен System.Collections. Ці колекції, включно з поширеними ArrayList і Hashtable, забезпечують певну безпеку потоку через властивість Synchronized, яка повертає потоково-безпечну обгортку, пов'язану з колекцією. Обгортка працює, блокуючи весь набір для кожної операції додавання або видалення. Тому кожен потік, що намагається отримати доступ до колекції, повинен чекати, поки настане його черга для отримання замка. Це не масштабується і призведе до значного погіршення продуктивності великих колекцій. Крім того, ця конструкція не повністю запобігає суперечкам. Для отримання додаткової інформації дивіться наступну сторінку на сайті MSDN: Синхронізація у загальних колекціях
Клас колекції, введений у .NET Framework 2.0, можна знайти у просторі імен System.Collections.Generic. Ці класи колекції включають List<T>, Dictionary< TKey, TValue> тощо. Ці класи забезпечують вищий тип безпеки та продуктивності порівняно з класами .NET Framework 1.0. Однак клас колекції .NET Framework 2.0 не забезпечує жодної синхронізації потоків; При додаванні або видаленні елементів у кількох потоках одночасно, користувацький код повинен забезпечувати всю синхронізацію.
Рекомендуємо використовувати паралельні класи збору в .NET Framework 4, оскільки вони забезпечують не лише типову безпеку класів колекції .NET Framework 2.0, а й більш ефективну та повну безпеку потоків, ніж захист потоків, яку забезпечує колекція .NET Framework 1.0.
Деякі типи одночасних колекцій використовують легкі механізми синхронізації, такі як SpinLock, SpinWait, SemaphoreSlim і CountdownEvent, які є новими для .NET Framework 4. Зазвичай наведені вище типи синхронізації використовують «зайняте обертання» на короткий час перед тим, як перевести потік у фактичний стан очікування. Якщо очікується, що час очікування буде дуже коротким, спін споживатиме значно менше обчислювальних ресурсів, ніж очікування, що передбачає конверсії ядра, які споживають багато ресурсів. Для класів колекції, що використовують ротацію, ця ефективність означає, що кілька потоків можуть дуже швидко додавати та видаляти елементи. Для отримання додаткової інформації про обмеження та блокування дивіться SpinLock і SpinWait. <T> Класи ConcurrentQueue і ConcurrentStack<T> взагалі не використовують блокування. Натомість вони покладаються на взаємоблоковані операції для безпеки потоків.
Ілюстрації
Оскільки паралельні класи колекції підтримують ICollection, вони надають реалізації властивостей IsSynchronized і SyncRoot, навіть якщо вони не пов'язані між собою. IsSynchronized завжди повертає false, тоді як SyncRoot завжди є null (нічого в Visual Basic).
У наступній таблиці наведені типи колекцій у просторі імен System.Collections.Concurrent.
тип | опис | BlockingCollection<T> | Забезпечує<T> будь-який тип тротлінгу та блокування для реалізації IProducerConsumerCollection. Для детальнішої інформації дивіться огляд BlockingCollection. | ConcurrentDictionary<TKey, TValue> | Ключ/значення — це поточнобезпечна реалізація словника. | ConcurrentQueue<T> | Реалізація FIFO черг для безпеки потоків (перший прийшов, перший вийшов). | ConcurrentStack<T> | Безпослідовна реалізація стеків LIFO (останній прийшов, перший вийшов). | ConcurrentBag<T> | Поточно-безпечна реалізація колекції елементів поза порядком. | IProducerConsumerCollection<T> | типи мають бути реалізовані уBlockingCollectionІнтерфейси, що використовуються в
|
|