.net framework 4 线程安全概述
2018-06-22 07:53:39来源:未知 阅读 ()
线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
早期的时候,微软的集合类实现线程安全是通过最基本的加锁实现的。我们可以注意到在system.collections 程序集中有两个提供了加锁机制的方法和字段,分别是_syncRoot 字段和Synchronized 方法。但是加锁来实现同步是粗粒度的,集合通过Synchronized 属性提供某种线程安全性。该包装的工作原理是: 对每个添加或删除操作,锁定整个集合。因此,每个尝试访问集合的线程必须一直等待,知道轮到它来获取锁。对于大型集合而言,将会导致性能显著降低
.net framework 4提供了细粒度锁定和无锁机制,新增的system.collections.concurrent 程序集中的线程安全集合就是使用轻量同步机制,如SpinLock, SpinWait, SemaphoreSlim和CountdownEvent。
轻量级同步原语只能用在一个进程内。而相应的那些重量级版本支持跨进程的同步。
轻量级同步更节省CPU开销以及避免了上下文切换
ConcurrentQueue的线程安全实现:
ConcurrentDictionary的线程安全实现:
ConcurretnStack的线程安全实现:
生产者消费者问题是典型的多线程应用问题:
简单的表述这个问题就是:有一个或多个线程(生产者线程)产生一些数据,同时,还有一个或者多个线程(消费者线程)要取出这些数据并执行一些相应的工作
微软的.net framework4提供了专门解决这类问题的并发类:BlockingCollection和IProducerConsumerCollection
BlockingCollection集合是一个拥有阻塞功能的集合,它就 是完成了经典生产者消费者的算法功能。它没有实现底层的存储结构,而是使用了实现IProducerConsumerCollection接口的几个集合 作为底层的数据结构,例如ConcurrentBag, ConcurrentStack或者是ConcurrentQueue。你可以在构造BlockingCollection实例的时候传入这个参数,如果 不指定的话,则默认使用ConcurrentQueue作为存储结构。
不得不说,现在的FCL 很完善,记得自己之前看过一篇博客抱怨.net 的线程安全做的没有java的好,当时我看完其实也有点惋惜,微软的技术人才那么多,怎么会做不好。看看现在的FCL还是很不错。
线程安全集合
https://msdn.microsoft.com/zh-cn/library/ms228964(v=vs.110).aspx
线程安全集合概述
https://msdn.microsoft.com/zh-cn/library/dd997305%28v=vs.110%29.aspx?lc=2052
C# 4.0之线程安全篇
http://www.cnblogs.com/chengxiaohui/articles/5672768.html
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- asp.net源程序编译为dll文件并调用的实现过程 2020-03-29
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- Asp.Net中WebForm的生命周期 2020-03-29
- ASP.NET使用Ajax返回Json对象的方法 2020-03-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash