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

纯干货哦,还不快收藏!

直接原因:并发读/写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不能有两把锁操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProblemTerminator

您的鼓励将是作者最大的动力哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值