[Go] 解决go的fatal error: concurrent map writes map非并发安全
2023-02-18 15:41:15 时间
map不是并发安全的 , 当有多个并发的groutine读写同一个map时
会出现panic错误
concurrent map writes
例如下面的代码会出现这个错误:
var mMap map[int]int func TestMyMap(t *testing.T) { mMap = make(map[int]int) for i := 0; i < 5000; i++ { go func() { mMap[i] = i }() go readMap(i) } } func readMap(i int) int { return mMap[i] }
解决这个错误可以有多种方式 , 现在采取读写锁的方式 ,
并发访问map是不安全的,会出现未定义行为,导致程序退出。所以如果希望在多协程中并发访问map,必须提供某种同步机制,一般情况下通过读写锁sync.RWMutex实现对map的并发访问控制,将map和sync.RWMutex封装一下,可以实现对map的安全并发访问
改造后的代码
type SMap struct { sync.RWMutex Map map[int]int } func (l *SMap) readMap(key int) (int, bool) { l.RLock() value, ok := l.Map[key] l.RUnlock() return value, ok } func (l *SMap) writeMap(key int, value int) { l.Lock() l.Map[key] = value l.Unlock() } var mMap *SMap func TestMyMap(t *testing.T) { mMap = &SMap{ Map: make(map[int]int), } for i := 0; i < 5000; i++ { go func() { mMap.writeMap(i, i) }() go readMap(i) } } func readMap(i int) (int, bool) { return mMap.readMap(i) }
有这三种方式:
1.使用channel
2.使用sync.map
3.使用map但必须进行加锁
相关文章
- Linux命令对应的英文及整体学习法
- 在线客服系统源码开发实战总结:Golang的Gin框架整合实现session
- Golang实现小型CMS内容管理功能(二):前端接入百度ueditor富文本编辑器
- 在线客服系统源码开发实战总结:Golang实现CMS内容管理增删查改功能
- 在线客服系统源码开发实战总结:Golang实现对接微信公众号网页授权接口功能
- 好用的在线客服系统Go语言源码-GOFLY ( 开源代码+安装教程)
- 解决golang报错:imports github.com/go-sql-driver/mysql from implicitly required module;
- golang连接MySQL并导入执行SQL文件
- 解决golang panic: sql: unknown driver “mysql“ (forgotten import?)
- golang封装http get函数请求并且携带header头信息
- golang实现RSA2的签名与验签函数
- Linux中tac命令倒序查询日志
- 开源在线客服系统源码(支持PC/H5/公众号/小程序)基于golang的网页在线客服系统
- 各浏览器useragent大全 包括(chrome/360/搜狗浏览器以及百度/google/搜狗/神马)
- 解决golang json: unsupported value: NaN
- 【Linux】curl: (60) SSL certificate problem: certificate has expired问题解决
- 【Golang】golang开发微信公众号网页授权功能
- 【Golang】golang实现简单memcache
- 【Golang】golang中time类型的before方法
- 【Golang】golang中map元素的删除和清空