zoukankan      html  css  js  c++  java
  • ConcurrentDictionary 并发字典

    线程安全

    • Dictionary 本身是不支持线程安全的
    • 线程的字典--ConcurrentDictionary

    线程安全实现

    写安全
    • 以往线程安全我们通过Lock实现 比如通过lock一个全局的object 但是这样的lock 会出现多个线程 虽然修改的不是同一地方的数据 但却要等待上一线程结束 才能继续 这种不是我们想要的
    • 我们想要 lock同一类的修改 这时候就可以用ConcurrentDictionary 该字典通过哈希算法 从数组lock[] 中找出key的准确lock【即 不同key的lock是不同的】这样多个线程之间写入是互不影响且安全的
    读安全
    • 大部分场景 不需要考虑线程安全 但是链式读取中 需要自上而下的查找 查找过程中链路是有可能被修改的 所以需要线程安全
    • ConcurrentDictionary 通过Volatile.Read 来读取数据 实现线程安全
      • 该方法从指定字段读取对象引用 在需要他的系统上 插入一个内存屏障 阻止处理区重新排序内存操作 如果在该方法之后出现读取写入 则处理器无法在此方法之前移动它
    更新

    ConcurrentDictionary 的更新有两种方式

    1. 直接判断该数据是否可以原子写入 可以就直接更新数据
    2. 不能原子写入 则创建一个新的node 然后覆盖原有的node
    • 这样做可以防止torn reads(撕裂读取:有的数据写入 需要多次分步写入 写一次 移动一下指针 但是在写一半时 又被其他线程读取 造成读取错误)

    引用:https://www.cnblogs.com/CoderAyu/p/10549409.html

  • 相关阅读:
    LCT 动态树 模板
    [HNOI2010] 物品调度 fsk
    [HNOI2010] 矩阵 matrix
    [HNOI2010] 平面图判定 planar
    [HNOI2010] 公交线路 bus
    [HNOI2017]抛硬币
    [HNOI2010] 弹飞绵羊 bounce
    [HNOI2010] 合唱队 chorus
    [HNOI2017]礼物
    [HNOI2017]大佬
  • 原文地址:https://www.cnblogs.com/Alicia-meng/p/14781168.html
Copyright © 2011-2022 走看看