这是一个创建于 2017-03-05 06:02:54 的文章,其中的信息可能已经有所发展或是发生改变。

一、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并发读写问题及解决方法相关推荐

  1. golang 中 map 转 struct

    golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...

  2. java多线程问题_【java 多线程】多线程并发同步问题及解决方法

    一.线程并发同步概念 线程同步其核心就在于一个"同".所谓"同"就是协同.协助.配合,"同步"就是协同步调昨,也就是按照预定的先后顺序进行运 ...

  3. activeMQ高并发发送消息异常解决方法

    高并发发送消息异常解决方法: 现象:使用10个线程每100ms发送一条消息,大约3000多条后,出现异常,所有线程停 止: javax.jms.JMSException:Could not conne ...

  4. itextpdf 实现html转pdf中中文及图片base64的解决方法

    为什么80%的码农都做不了架构师?>>>    itextpdf 实现html转pdf中中文及图片base64的解决方法: 1. 中文解决方案: 实现FontProvider接口: ...

  5. 计算机硬盘一直加载,win10硬盘一直读写怎么办_win10电脑一直在读写硬盘的解决方法...

    一些用户的win10系统使用久了,会出现win10 32位系统的硬盘一直处于读取状态,使用起来非常不方便,有什么办法可以永久解决win10系统硬盘一直处于读写状态的问题,其实要解决这个很简单,下面就来 ...

  6. jquery.ajax的url中传递中文乱码问题的解决方法

    jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQuer ...

  7. php中隐藏网址,是否隐藏前台网址中的index.php文件名 解决方法

    是否隐藏前台网址中的index.php文件名,解决方法如下: 第一步:先在网站后台设置隐藏前台网址中的index.php文件名(如图所示). 如果空间不支持,就要按下面步骤操作. 第二步:可以通过UR ...

  8. 在一个有返回值的方法中,用block回传的解决方法

    在一个有返回值的方法中,用block回传的解决方法 参考文章: (1)在一个有返回值的方法中,用block回传的解决方法 (2)https://www.cnblogs.com/dsp-ios/p/64 ...

  9. 开发chrome 插件, background.js中 console log 看不到解决方法

    开发chrome 插件, background.js中 console log 看不到解决方法 参考文章: (1)开发chrome 插件, background.js中 console log 看不到 ...

最新文章

  1. 浅谈程序员的“内卷化”
  2. #脱贫攻坚#彭蕾卸任蚂蚁金服后首次现身:女性脱贫亮三招
  3. BETA:由清华大学等多家研究机构联合提出的面向SSVEP-BCI应用程序的大型基准测试数据库...
  4. getoutputstream java_java socket getInputStream getOutputStream
  5. Java多线程之线程间协作 notify与wait的使用
  6. 面向对象的三大特性————继承,多态
  7. 第三次学JAVA再学不好就吃翔(part112)--内存输出流
  8. 130 秒揭秘 EDAS 3.0 如何平滑应对突发流量高峰,为您的业务保驾护航
  9. 共性的缺失——由博客想到的
  10. 201521123045 《Java程序设计》第7周学习总结
  11. cocos creator-js-虚拟摇杆
  12. 数据库开源项目_开源项目贴纸库
  13. 《知行合一王阳明》阅读心得
  14. 非标自动化设备设计制造的13个步骤 || 技巧总结
  15. 中秋闲来无事,自己写个2048玩玩
  16. 计算机基础——计算机基础知识
  17. C语言在开发中的应用博文汇总贴
  18. 计算机网络HTTP篇(一)HTTP 常见面试题
  19. 图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖!
  20. 剑指offer第二版——面试题9(java)

热门文章

  1. ORA-27301 解决一例
  2. 电缆桥架安装规范标准_电缆桥架怎么安装,桥架安装工艺分享
  3. 【数据挖掘知识点三】大数定理与中心极限定理
  4. 【正一专栏】里皮神奇不再,国足梦断伊朗魔鬼主场
  5. (转载)为什么Linux不需要碎片整理?
  6. c++ 用指针将函数作为参数传参
  7. Git 技术篇 - Github在项目分支里下载某个文件方法,Github项目里的单个js文件下载实例演示
  8. Tomcat 最新版安装与使用手册,tomcat更改端口号方法,tomcat控制台乱码问题解决方法
  9. 微信小程序中阻止事件冒泡
  10. C# 学习笔记(18)操作SQL Server 中