线程安全

  • 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

最新文章

  1. Hibernate5.2之多对多关联关系(六)
  2. 关于前端build工具
  3. php中文乱码问题
  4. ajax加载模块实时刷新的原理
  5. ios开发之数据存储
  6. python多线程生成缩略图
  7. SLAM学习笔记(3)相关概念
  8. Android播放视频
  9. HDU 1257 最少拦截系统 (DP || 贪心)
  10. Python中类的运算符重载
  11. xml基础小结
  12. SQL总结之导入导出
  13. 图文详解linux/windows mysql忘记root密码解决方案
  14. alpha-咸鱼冲刺day5-紫仪
  15. 常用API3 BigData
  16. kubernetes 1.3 使用skydns + kube2dns +etcd部署DNS服务器
  17. 搭建简单SBT工程实践
  18. 实用shell命令100条
  19. Redis持久化之RDB&&AOF的区别
  20. 从零开始编写自己的JavaScript框架(一)

热门文章

  1. python使用笔记22--mock接口开发
  2. C语言:赋值
  3. win10 sql2008r2网页不能使用数据,需要开启端口1433
  4. SpringMVC架构(一)
  5. 2018年成为Web开发者的路线图
  6. bash对一个目录中文件名的遍历
  7. 第3天 IDEA 2021简单设置与优化 Java运算符 包机制
  8. 第四篇--Beyond Compare4 试用期30天后
  9. Cookie、Session、JWT在koa中的应用及实现原理
  10. tensorflow踩坑合集2. TF Serving & gRPC 踩坑