知识卡片

Map并发边界

普通读书笔记卡 · 1474.a.1.a

内容

普通 map 不支持并发读写,因为扩容、桶迁移和写入状态会破坏内部一致性。并发场景要用锁、sync.Map 或单协程所有权;容器的易用性不能替代同步协议。

参考来源

- 位置:《Go语言底层原理剖析》第8章《哈希表与Go语言实现机制》8.2.5节《map并发冲突》与8.5.4节《map赋值操作原理》 - 结论依据:原文说明"map并不支持并发的读写",并发读写会报错为"fatal error:concurrent map read and map write";同时指出赋值时"每个map都有一个flags标志位,如果正在执行写入操作,则当前map的hashWriting标志位会被设置为1",用于在访问时检测并发写入,因此可以推出"map 不支持并发读写是因为写入状态标志和桶结构缺乏同步保护"的结论。 - 原始内容:和其他语言不同的是,map并不支持并发的读写,map并发读写是初级开发者经常会犯的错误。下面的操作由于协程并发读写会报错为fatal error:concurrent map read and map write……和访问操作一样,赋值操作时会先计算key的hash值,标记当前map是写入状态……每个map都有一个flags标志位,如果正在执行写入操作,则当前map的hashWriting标志位会被设置为1。