纯干货哦。
直接原因:并发读/写map时造成的问题。你的问题源头必然在下面几个原因之列。
目录
原因1:加解锁异常
原因2:加解锁代码看起来貌似正常
原因3:锁未加完全
原因4:对该map加的不是同一把锁
相似的报错:fatal error: concurrent map writes
原因1:加解锁异常代码写的不严谨,加锁后未解锁,未形成单次闭环
解决:形成闭环,有加得必须有解
实际上是加锁内部的代码加了个寂寞,map *** 作不在锁的范围内,和外部的代码在使用的
(共同读写的)还是相同的map(同地址),锁未起实际作用
解决:对map数据进行转移不使用旧map,在加锁与解锁之间生成新的map,
将数据转移至新map(或其它数据结构)再返回新map
或
调整代码位置即可
原因3:锁未加完全
只给写map的goroutine实施了加解锁,而读goroutine方面没有;
或
只给读map的goroutine实施了加解锁,而写goroutine方面没有;
或
未加锁
举例:对于某map,读map有2个goroutine,写map有2个goroutine,这四个依次编号为1,2,3,4,前3个使用mu1,最后一个使用mu2,就会造成该报错。
温馨提示:
同一把锁可以作用多个map,但同一个map不能有两把锁 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)