golang中map并发读写问题及解决方法
一、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)读写锁
type Demo struct {
Data map[string]string
Lock sync.RwMutex
}
func (d Demo) Get(k string) string{
d.Lock.RLock()
defer d.Lock.RUnlock()
return d.Data[k]
}
func (d Demo) Set(k,v string) {
d.Lock.Lock()
defer d.Lock.UnLock()
d.Data[k]=v
}
2、利用channel串行化处理
转载于:https://www.cnblogs.com/williamjie/p/9933644.html
golang中map并发读写问题及解决方法相关推荐
- golang 中 map 转 struct
golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...
- java多线程问题_【java 多线程】多线程并发同步问题及解决方法
一.线程并发同步概念 线程同步其核心就在于一个"同".所谓"同"就是协同.协助.配合,"同步"就是协同步调昨,也就是按照预定的先后顺序进行运 ...
- activeMQ高并发发送消息异常解决方法
高并发发送消息异常解决方法: 现象:使用10个线程每100ms发送一条消息,大约3000多条后,出现异常,所有线程停 止: javax.jms.JMSException:Could not conne ...
- itextpdf 实现html转pdf中中文及图片base64的解决方法
为什么80%的码农都做不了架构师?>>> itextpdf 实现html转pdf中中文及图片base64的解决方法: 1. 中文解决方案: 实现FontProvider接口: ...
- 计算机硬盘一直加载,win10硬盘一直读写怎么办_win10电脑一直在读写硬盘的解决方法...
一些用户的win10系统使用久了,会出现win10 32位系统的硬盘一直处于读取状态,使用起来非常不方便,有什么办法可以永久解决win10系统硬盘一直处于读写状态的问题,其实要解决这个很简单,下面就来 ...
- jquery.ajax的url中传递中文乱码问题的解决方法
jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQuer ...
- php中隐藏网址,是否隐藏前台网址中的index.php文件名 解决方法
是否隐藏前台网址中的index.php文件名,解决方法如下: 第一步:先在网站后台设置隐藏前台网址中的index.php文件名(如图所示). 如果空间不支持,就要按下面步骤操作. 第二步:可以通过UR ...
- 在一个有返回值的方法中,用block回传的解决方法
在一个有返回值的方法中,用block回传的解决方法 参考文章: (1)在一个有返回值的方法中,用block回传的解决方法 (2)https://www.cnblogs.com/dsp-ios/p/64 ...
- 开发chrome 插件, background.js中 console log 看不到解决方法
开发chrome 插件, background.js中 console log 看不到解决方法 参考文章: (1)开发chrome 插件, background.js中 console log 看不到 ...
最新文章
- 浅谈程序员的“内卷化”
- #脱贫攻坚#彭蕾卸任蚂蚁金服后首次现身:女性脱贫亮三招
- BETA:由清华大学等多家研究机构联合提出的面向SSVEP-BCI应用程序的大型基准测试数据库...
- getoutputstream java_java socket getInputStream getOutputStream
- Java多线程之线程间协作 notify与wait的使用
- 面向对象的三大特性————继承,多态
- 第三次学JAVA再学不好就吃翔(part112)--内存输出流
- 130 秒揭秘 EDAS 3.0 如何平滑应对突发流量高峰,为您的业务保驾护航
- 共性的缺失——由博客想到的
- 201521123045 《Java程序设计》第7周学习总结
- cocos creator-js-虚拟摇杆
- 数据库开源项目_开源项目贴纸库
- 《知行合一王阳明》阅读心得
- 非标自动化设备设计制造的13个步骤 || 技巧总结
- 中秋闲来无事,自己写个2048玩玩
- 计算机基础——计算机基础知识
- C语言在开发中的应用博文汇总贴
- 计算机网络HTTP篇(一)HTTP 常见面试题
- 图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖!
- 剑指offer第二版——面试题9(java)
热门文章
- ORA-27301 解决一例
- 电缆桥架安装规范标准_电缆桥架怎么安装,桥架安装工艺分享
- 【数据挖掘知识点三】大数定理与中心极限定理
- 【正一专栏】里皮神奇不再,国足梦断伊朗魔鬼主场
- (转载)为什么Linux不需要碎片整理?
- c++ 用指针将函数作为参数传参
- Git 技术篇 - Github在项目分支里下载某个文件方法,Github项目里的单个js文件下载实例演示
- Tomcat 最新版安装与使用手册,tomcat更改端口号方法,tomcat控制台乱码问题解决方法
- 微信小程序中阻止事件冒泡
- C# 学习笔记(18)操作SQL Server 中