架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 33605|回复: 4

[资料] .net/c# 线程安全集合(整理)

[复制链接]
发表于 2017-6-6 17:13:53 | 显示全部楼层 |阅读模式
可以在 System.Collections 命名空间中找到 .NET Framework 1.0 中引入的集合。 这些集合(包括常用的 ArrayList 和 Hashtable)通过 Synchronized 属性(此属性返回与集合有关的线程安全包装)提供某种线程安全性。 该包装的工作原理是:对每个添加或移除操作锁定整个集合。 因此,每个尝试访问集合的线程必须一直等待,直到轮到它来获取锁。 这是无法进行伸缩的,并且对于大型集合而言,将会导致性能显著降低。 此外,这一设计并不能完全防止出现争用情况。 有关更多信息,请参见MSDN网站上的以下页面:Synchronization in Generic Collections

可以在 System.Collections.Generic 命名空间中找到 .NET Framework 2.0 中引入的集合类。 这些集合类包括 List<T>、Dictionary<TKey,&#8194;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 and SpinWait 。ConcurrentQueue<T> 和 ConcurrentStack<T> 类根本不使用锁定。 相反,它们依赖 Interlocked 操作来实现线程安全性。

说明

由于并发集合类支持 ICollection,因此它们可提供针对 IsSynchronized 和 SyncRoot 属性的实现,即使这些属性是不相关的。 IsSynchronized 始终返回 false,而 SyncRoot 始终为 null(在 Visual Basic 中为 Nothing)。

下表列出了 System.Collections.Concurrent 命名空间中的集合类型。



类型
描述
BlockingCollection<T>
提供针对实现 IProducerConsumerCollection<T> 的任何类型的限制和阻塞功能。 有关详细信息,请参阅BlockingCollection 概述。
ConcurrentDictionary<TKey,&#8194;TValue>
键/值对字典的线程安全实&#8203;现。
ConcurrentQueue<T>
FIFO(先进先出)队列的线程安全实现。
ConcurrentStack<T>
LIFO(后进先出)堆栈的线程安全实现。
ConcurrentBag<T>
无序的元素集合的线程安全实现。
IProducerConsumerCollection<T>
类型必须实现以在 BlockingCollection 中使用的接口。







上一篇:.net/c# itextsharp生成PDF代码
下一篇:Install-Package : “MvvmLightLibs”已拥有为“CommonServiceLocator”定义的依赖...
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-11-8 15:24:45 | 显示全部楼层
不错,学习了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-2-8 10:00:41 | 显示全部楼层
List<T> 如果在迭代过程中根本不修改列表,则迭代是线程安全的。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-3-23 11:32:46 | 显示全部楼层
ConcurrentDictionary对于新增及更新的支持
https://www.itsvse.com/thread-2955-1-1.html

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-6-24 14:20:57 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-3-29 12:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表