Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 69126|Ответ: 4

[Источник] .NET/C# Collection Thread Safety Collection (колляция)

[Скопировать ссылку]
Опубликовано 06.06.2017 17:13:53 | | |
Коллекции, введённые в .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 (last-in, first-out).
ConcurrentBag<T>
Потечно-безопасная реализация коллекции элементов вне порядка.
IProducerConsumerCollection<T>
типы должны быть реализованы вBlockingCollectionИнтерфейсы, используемые в







Предыдущий:.net/c# itextsharp для генерации PDF-кода
Следующий:Install-Package: "MvvmLightLibs" уже имеет определенную зависимость для "CommonServiceLocator"...
Опубликовано 08.11.2017 15:24:45 |
Да, я узнал
 Хозяин| Опубликовано 08.02.2021 10:00:41 |
Список<T> является безопасенным для потоков, если список не изменяется вовсе в ходе итерации.
 Хозяин| Опубликовано 23.03.2021 11:32:46 |
ConcurrentDictionary поддерживает новые и обновлённые обновления
https://www.itsvse.com/thread-2955-1-1.html

 Хозяин| Опубликовано 24.06.2023 14:20:57 |
Неизменная коллекция:https://learn.microsoft.com/zh-cn/dotnet/standard/collections/
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com