go map fatal error:concurrent map read and map write
go map fatal error:concurrent map read and map write
go语言切片slice的线程协程安全问题
一、map并发读写问题
如果map由多协程同时读和写就会出现 fatal error:concurrent map read and map write的错误
如下代码很容易就出现map并发读写问题
func main(){
c := make(map[string]int)
Go func() {//开一个协程写map
for j := 0; j < 1000000; j++ {
c[fmt.Sprintf("%d", j)] = j
}
}()
go func() { //开一个协程读map
for j := 0; j < 1000000; j++ {
fmt.Println(c[fmt.Sprintf("%d",j)])
}
}()
time.Sleep(time.Second*20)
}
多个协程同时写也会出现fatal error: concurrent map writes的错误
如下代码很容易出现map并发写的问题
func main(){
c := make(map[string]int)
for i := 0; i < 100; i++ {
go func() { //开100个协程并发写map
for j := 0; j < 1000000; j++ {
c[fmt.Sprintf("%d", j)] = j
}
}()
}
time.Sleep(time.Second*20) //让执行main函数的主协成等待20s,不然不会执行上面的并发操作
}
二、出现问题的原因
因为map为引用类型,所以即使函数传值调用,参数副本依然指向映射m, 所以多个goroutine并发写同一个映射m, 写过多线程程序的同学都知道,对于共享变量,资源,并发读写会产生竞争的, 故共享资源遭到破坏
三、解决方法
1、加锁
(1)通用锁
type Demo struct {
Data map[string]string
Lock sync.Mutex
}
func (d Demo) Get(k string) string{
d.Lock.Lock()
defer d.Lock.UnLock()
return d.Data[k]
}
func (d Demo) Set(k,v string) {
d.Lock.Lock()
defer d.Lock.UnLock()
d.Data[k]=v
}
(2)读写锁
2、利用channel串行化处理
go map fatal error:concurrent map read and map write相关推荐
- vcftools报错:Writing PLINK PED and MAP files ... Error: Could not open temporary file.解决方案
vcftools报错:Writing PLINK PED and MAP files ... Error: Could not open temporary file.解决方案 参考文章: (1)vc ...
- 解决DevTools failed to load SourceMap Could not load content for .js.map HTTP error code 404 问题
问题 DevTools failed to load SourceMap: Could not load content for ***.js.map: HTTP error: status code ...
- 如何解决在打开pip时遇到Fatal error in launcher: Unable to create process using 的问题
如何解决在打开pip时遇到Fatal error in launcher: Unable to create process using 的问题 原创 qq_40608730 最后发布于2020-03 ...
- MacOS Clion 使用<bits/stdc++.h>万能头提示 fatal error: ‘bits/stdc++.h‘ file not found
MacOS Clion 使用<bits/stdc++.h>万能头提示 fatal error: 'bits/stdc++.h' file not found 百度搜了一圈答案,都大坑了,自 ...
- vs2017: fatal error LNK1210: 已超过内部 ILK 大小限制;链接时使用 /INCREMENTAL:NO
vs2017碰到个怪问题:LINK : fatal error LNK1210: 已超过内部 ILK 大小限制:链接时使用 /INCREMENTAL:NO 找了一下, https://stackove ...
- fatal error: exception: No such file or directory
fatal error: exception: No such file or directory #include 用C编程的时候,碰到这样一个错误,提示缺少系统头文件类似的还有 fatal err ...
- c++ map初始化同时赋值_Golang入门教程——map篇
点击上方蓝字,和我一起学技术. 今天是golang专题的第7篇文章,我们来聊聊golang当中map的用法. map这个数据结构我们经常使用,存储的是key-value的键值对.在C++/java当中 ...
- HashMap和Hashtable的区别--List,Set,Map等接口是否都继承自Map接口--Collection和Collections的区别...
面试题: 1.HashMap和Hashtable的区别?HashMap:线程不安全,效率高,键和值都允许null值Hashtable:线程安全,效率低,键和值都不允许null值ArrayList代替V ...
- java map 转string_java-将Map String,Object转换为Map String,String
java-将Map 转换为Map 如何将Map转换为Map? 这不起作用: Map map = new HashMap(); //Object is containing String Map new ...
最新文章
- andriod studio中的显式跳转和隐式跳转
- php call_user_func和,php – call_user_func()和$var()之间有区别吗?
- UIButton的属性设置
- 在python中使用sort_Python中的sort()方法使用基础教程
- 图书销售管理系统概要分析报告总体分工
- Azure 部署 Asp.NET Core Web App
- 迷你世界显示未连接服务器成功,迷你世界登录未成功是什么意思 | 手游网游页游攻略大全...
- 在webLogic 10.3中部署Hibernate 3.5出现 ClassNotFoundException解决办法
- matplotlib导包
- python flask框架优点_python之全栈(Flask框架)
- re模块中的非贪婪匹配
- java windows wrapper_Java Service Wrapper 发布Java程序为Windows服务
- MYSQL数据库基础概念
- Hi3559a sdk环境搭建
- NLP中embeding干了什么事?怎么干的?
- HTL/TTL转光纤模块
- unity 环境光、模型、材质发绿,绿的发光
- MySQL day10
- brpc学习笔记(1)
- Adobe国际认证-数字素养使青年能够在世界创造变革,并获得成功
热门文章
- 程序提交RE错误问题
- 青海省计算机考试准考证2022
- c代码实现 ifft运算_月光软件站 - 编程文档 - 其他语言 - 时间抽选基2FFT及IFFT算法C语言实现...
- 嵌入式常见术语或缩写
- clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现...
- 机器学习课程 Variational Inference
- 曲面细分(loop曲面细分,catmull曲面细分)(计算机图形学学习笔记)
- 城市轨道交通运营票务管理论文_城市轨道交通票务管理问题研究-城市轨道交通票务管理...
- Chrome网页截屏
- bzoj4044 [Cerc2014] Virus synthesis