线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
早期的时候,微软的集合类实现线程安全是通过最基本的加锁实现的。我们可以注意到在system.collections 程序集中有两个提供了加锁机制的方法和字段,分别是_syncRoot 字段和Synchronized 方法。但是加锁来实现同步是粗粒度的,集合通过Synchronized 属性提供某种线程安全性。该包装的工作原理是: 对每个添加或caozuo.html" target="_blank">删除操作,锁定整个集合。因此,每个尝试访问集合的线程必须一直等待,知道轮到它来获取锁。对于大型集合而言,将会导致性能显著降低
.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