当前位置: 首页 > news >正文

fatal error: concurrent map iteration and map write - 关于Go中并发访问Map的操作

0x00 缘起

存在以下需求, 需要服务器统计提交到服务器所有的关键字的次数. 也就说, 服务器将接收到一组关键字数组, 而服务器要将所有的关键字进行累加. 毫无疑问, 若在单线程中进行上述业务, 无需考虑并发问题. 而本次业务要求为: 使用Go中的Map实现, 且不借助数据库软件.

使用Map设计过程中, 使用了整体锁与元素锁结合的方式, 可是出现了错误: "fatal error: concurrent map iteration and map write;", 本文将记录解决问题的方法.

0x01 思路

起初, 设计的数据结构中, 存在整体锁和元素锁.

整体锁的作用为: 当批量的操作整个表时, 如造成表结构发生变化时, 使用整体锁锁定临界资源, 实现并发访问.

元素锁也就是对Map中每一个元素的锁, 也就是对某一个元素进行读写时, 需要使用的锁, 如以下代码.

	countTable = model.SafeDictCountTable{Table:      make(model.DictCountTable),TableMutex: sync.RWMutex{},ElementMutexes: make(map[string]*sync.RWMutex),NextID:  1,IDMutex: sync.RWMutex{},}

其中, Table为临界资源, TableMutex为整体锁, ElementMutexes为元素锁. 两个锁的优势为: 能够一定程度上提高并发能力, 支持元素级别细粒度的访问.

以下为对上述结构的算法, 算法首先锁住整张表, 获取到元素锁后, 释放对整张表的锁定. 开始对元素进行操作.

func countKey(key string) {/**- 对于Map的细粒度访问是Map整体, 而不是其中某一个元素- 本写法希望对整体有锁, 对于某个元素有锁, 可是这样

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • android compose设置圆角不起作用
  • Visual Studio 和 VSCode 哪个好?
  • mac下载exe后不自动打开虚拟机
  • 全自动真空拌馅机 肠类肉丸类馅料搅拌机:
  • 系统 hap
  • 2021年庐阳区青少年信息学科普日真题- 跳跃(jump)
  • 代码随想录算法训练营第三十二天 | 动态规划 part01
  • 《学会 SpringMVC 系列 · 剖析出参处理》
  • MacOS 中 Office 历史记录一键清理
  • 2024全新Thinkphp聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能/全开源运营版本
  • 源代码加密防泄漏如何做?
  • 如何实现element-ui 后台中点击按钮,将文本内容复制到剪贴板
  • 【RunnerGo】离线安装成功版本
  • Transwarp Data Studio 4.0 :适应AI新时代实现三大能力提升
  • java基础--字符串用法
  • ES6之路之模块详解
  • IP路由与转发
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • javascript 总结(常用工具类的封装)
  • Java基本数据类型之Number
  • js正则,这点儿就够用了
  • Laravel Telescope:优雅的应用调试工具
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Nodejs和JavaWeb协助开发
  • Phpstorm怎样批量删除空行?
  • Redis的resp协议
  • session共享问题解决方案
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 百度小程序遇到的问题
  • 汉诺塔算法
  • 强力优化Rancher k8s中国区的使用体验
  • 在electron中实现跨域请求,无需更改服务器端设置
  • No resource identifier found for attribute,RxJava之zip操作符
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • # 达梦数据库知识点
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #在 README.md 中生成项目目录结构
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (day 12)JavaScript学习笔记(数组3)
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (三)终结任务
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)重识new
  • .gitignore文件设置了忽略但不生效
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Core中的去虚
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 通过系统影子账户实现权限维持
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中创建支持集合初始化器的类型
  • .Net6使用WebSocket与前端进行通信