详解go报错fatal error: concurrent map iteration and map write

详解go报错fatal error: concurrent map iteration and map write,第1张

纯干货哦。

直接原因:并发读/写map时造成的问题。你的问题源头必然在下面几个原因之列。

目录

原因1:加解锁异常

原因2:加解锁代码看起来貌似正常

原因3:锁未加完全

原因4:对该map加的不是同一把锁


相似的报错:fatal error: concurrent map writes

原因1:加解锁异常

代码写的不严谨,加锁后未解锁,未形成单次闭环
解决:形成闭环,有加得必须有解

原因2:加解锁代码看起来貌似正常

实际上是加锁内部的代码加了个寂寞,map *** 作不在锁的范围内,和外部的代码在使用的
(共同读写的)还是相同的map(同地址),锁未起实际作用

解决:对map数据进行转移不使用旧map,在加锁与解锁之间生成新的map,
将数据转移至新map(或其它数据结构)再返回新map

调整代码位置即可

原因3:锁未加完全


只给写map的goroutine实施了加解锁,而读goroutine方面没有;

只给读map的goroutine实施了加解锁,而写goroutine方面没有;

未加锁

原因4:对该map加的不是同一把锁


举例:对于某map,读map有2个goroutine,写map有2个goroutine,这四个依次编号为1,2,3,4,前3个使用mu1,最后一个使用mu2,就会造成该报错。


温馨提示:
同一把锁可以作用多个map,但同一个map不能有两把锁 *** 作。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/993881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存