map写入源代码写冲突
在map写入的时候,源代码有段如下
if h.flags&hashWriting != 0 {
throw("concurrent map writes")
}
hash := t.hasher(key, uintptr(h.hash0))
h.flags ^= hashWriting
上面的作用应该是避免写冲突,但是我看着如果两个goroutine一起进来,h.flags&hashWriting并不会把它们拦住,前后脚进入h.flags ^= hashWriting,最终h.flags的hashWriting位变成0了,也达不到避免写冲突的效果,这么理解是哪里不对?
并发检查:
1.h.flags&hashWriting != 0
h.flags默认为0,此时条件判断为false
若flags不为0,则已有gorountine在修改map,throw("concurrent map writes")
2.确认无同时写后更新flags值-h.flags^= hashWriting,此时flags改为4
3.携入完成时再次检查
h.flags&hashWriting == 0
此时flags应仍为4,说明无其他gorountine操作,结果为false
若flags已被重置为0,则说明发生并发操作,throw("concurrent map writes")
4.重置flags为0 h.flags&^= hashWriting
简单的保证不会同时有多个gorountine进行数据操作