线程安全

  • 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

ConcurrentDictionary 并发字典的更多相关文章

  1. ConcurrentDictionary并发字典知多少?

    背景 在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理. 有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题. https://doc ...

  2. 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全

    原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...

  3. 设计模式之美:Iterator(迭代器)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...

  4. C#随学随记

    1.Microsoft.NET是基于Windows平台的一种技术(简称.NET),它包含了能在.NET Framework平台运行的所有语言..NET Framework是微软为开发应用程序创建的一个 ...

  5. c#多线程总结(纯干货)

    线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 ...

  6. Orchard详解--第五篇 CacheManager

    上一篇文章介绍了Orchard中的缓存,本篇主要针对CacheManager进行分析,CacheManager在Orchard中用于存储应用程序的配置信息以及框架内部的一些功能支持,包括整个拓展及拓展 ...

  7. NET full stack framework

    NFX UNISTACK 介绍 学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumc ...

  8. NFX UNISTACK 介绍

    学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumcode/nfx NFX Serv ...

  9. [Abp vNext 源码分析] - 14. EntityFramework Core 的集成

    一.简要介绍 在以前的文章里面,我们介绍了 ABP vNext 在 DDD 模块定义了仓储的接口定义和基本实现.本章将会介绍,ABP vNext 是如何将 EntityFramework Core 框 ...

随机推荐

  1. libcurl库(C++)快速使用

    ---恢复内容开始--- libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支 ...

  2. CTF-Streamgame1-writeup

    Streamgame1 题目信息: 附件: streamgame1.py from flag import flag assert flag.startswith("flag{") ...

  3. 注解@ConfigurationProperties使用方法(二十)

    前言 最近在思考使用java config的方式进行配置,java config是指基于java配置的spring.传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多java ...

  4. [考试总结]noip模拟10

    不小心有咕掉了一段时间 这次考试咕掉的分数也是太多了 然后就是这次暴力完全没有打满 遗憾啊遗憾 T1 入阵曲 前面的题目背景故意引导我们去往矩阵快速幂的方向去想 然而半毛钱关系没有 其实就是维护前缀和 ...

  5. 第四篇--git 上传可能出现的问题

    1. Q:fatal: TaskCanceledException encountered. A task was canceled. A:$ git config --system --unset ...

  6. linux 之awk 次数统计

    sort +awk+uniq 统计文件中出现次数 jps -v |grep jar|grep -v Jps|awk  'BEGIN{FS=".jar "} {print $1}'  ...

  7. dragover event 翻译

    当选择的元素或文本被拖拽到一个有效的放置目标上时(每几百毫秒),dragover事件就会被触发. 该事件在放置目标上被触发. Property Type Description target Read ...

  8. js 日期转为时间戳

    在js中,将一个字符转化成Date型也不是什么难事:var str = '2013-08-30'; // 日期字符串str = str.replace(/-/g,'/'); // 将-替换成/,因为下 ...

  9. 简单的Postman,还能玩出花?

    Postman是一款我们在工作中使用频率非常高的API调试工具,估计很多童鞋在使用它时也比较粗暴,填好接口地址.参数,直接send就完事了,估计大家要说了,这么简单的东西还能玩出什么花来.今天就和大家 ...

  10. 洛谷P2210题解

    题面 模拟退火练手好题. 对于这个题,一般有两种解法: 每次随机两个数交换. 每次直接打乱数组. 两个方法都可以过,我写了第一种,因为不想用stl. 代码