• .net framework 4 线程安全概述


    线程安全:
    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

    早期的时候,微软的集合类实现线程安全是通过最基本的加锁实现的。我们可以注意到在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

  • 相关阅读:
    C#的ThreadStart 和 Thread
    Thread.Join() 方法
    JSON 数据格式
    C#调试入门篇
    dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
    由一篇文章引发的思考——多线程处理大数组
    windows如何定时关闭一个程序
    Spring Boot连接DB2查询结果时报错“java.lang.AbstractMethodError: com.ibm.db2.jcc.t4.b.isValid(I)Z”的解决办法
    [转]德哥的PostgreSQL私房菜
    CockroachDB学习笔记——[译]为什么Go语言是CockroachDB的正确选择
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/7764998.html
Copyright © 2020-2023  润新知