go map fatal error:concurrent map read and map write

golang中map并发读写问题及解决方法

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)读写锁

type MapTplResCode struct {
Data map[ string] int
Lock *sync.RWMutex
}
func (d MapTplResCode) Get(k string) ( int, bool) {
d.Lock. RLock()
defer d.Lock. RUnlock()
if v, ok := d.Data[k]; ok {
return v, true
}
return 0, false
}
func (d MapTplResCode) Set(k string, v int) {
d.Lock. Lock()
defer d.Lock. Unlock()
d.Data[k] = v
}
func (d MapTplResCode) Init() {
d.Lock. Lock()
defer d.Lock. Unlock()
//d.Data = make(map[string]int)
for key, _ := range d.Data {
delete(d.Data, key)
}
}

2、利用channel串行化处理

go map fatal error:concurrent map read and map write相关推荐

  1. 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 ...

  2. 解决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 ...

  3. 如何解决在打开pip时遇到Fatal error in launcher: Unable to create process using 的问题

    如何解决在打开pip时遇到Fatal error in launcher: Unable to create process using 的问题 原创 qq_40608730 最后发布于2020-03 ...

  4. 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 百度搜了一圈答案,都大坑了,自 ...

  5. vs2017: fatal error LNK1210: 已超过内部 ILK 大小限制;链接时使用 /INCREMENTAL:NO

    vs2017碰到个怪问题:LINK : fatal error LNK1210: 已超过内部 ILK 大小限制:链接时使用 /INCREMENTAL:NO 找了一下, https://stackove ...

  6. fatal error: exception: No such file or directory

    fatal error: exception: No such file or directory #include 用C编程的时候,碰到这样一个错误,提示缺少系统头文件类似的还有 fatal err ...

  7. c++ map初始化同时赋值_Golang入门教程——map篇

    点击上方蓝字,和我一起学技术. 今天是golang专题的第7篇文章,我们来聊聊golang当中map的用法. map这个数据结构我们经常使用,存储的是key-value的键值对.在C++/java当中 ...

  8. HashMap和Hashtable的区别--List,Set,Map等接口是否都继承自Map接口--Collection和Collections的区别...

    面试题: 1.HashMap和Hashtable的区别?HashMap:线程不安全,效率高,键和值都允许null值Hashtable:线程安全,效率低,键和值都不允许null值ArrayList代替V ...

  9. 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 ...

最新文章

  1. andriod studio中的显式跳转和隐式跳转
  2. php call_user_func和,php – call_user_func()和$var()之间有区别吗?
  3. UIButton的属性设置
  4. 在python中使用sort_Python中的sort()方法使用基础教程
  5. 图书销售管理系统概要分析报告总体分工
  6. Azure 部署 Asp.NET Core Web App
  7. 迷你世界显示未连接服务器成功,迷你世界登录未成功是什么意思 | 手游网游页游攻略大全...
  8. 在webLogic 10.3中部署Hibernate 3.5出现 ClassNotFoundException解决办法
  9. matplotlib导包
  10. python flask框架优点_python之全栈(Flask框架)
  11. re模块中的非贪婪匹配
  12. java windows wrapper_Java Service Wrapper 发布Java程序为Windows服务
  13. MYSQL数据库基础概念
  14. Hi3559a sdk环境搭建
  15. NLP中embeding干了什么事?怎么干的?
  16. HTL/TTL转光纤模块
  17. unity 环境光、模型、材质发绿,绿的发光
  18. MySQL day10
  19. brpc学习笔记(1)
  20. Adobe国际认证-数字素养使青年能够在世界创造变革,并获得成功

热门文章

  1. 程序提交RE错误问题
  2. 青海省计算机考试准考证2022
  3. c代码实现 ifft运算_月光软件站 - 编程文档 - 其他语言 - 时间抽选基2FFT及IFFT算法C语言实现...
  4. 嵌入式常见术语或缩写
  5. clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现...
  6. 机器学习课程 Variational Inference
  7. 曲面细分(loop曲面细分,catmull曲面细分)(计算机图形学学习笔记)
  8. 城市轨道交通运营票务管理论文_城市轨道交通票务管理问题研究-城市轨道交通票务管理...
  9. Chrome网页截屏
  10. bzoj4044 [Cerc2014] Virus synthesis