某厂面试
面试官:map是并发安全的吗?
我:不是
面试官:那并发访问会怎样
我:触发panic
面试官:那这个panic是怎么实现的。
我: 。。。。
当时猜测是根据一些标志位实现的,但是这块之前没有看过源码,面试结束后复习源码。
首先并发访问,报错:
concurrent map writes
根据相关报错信息,查找源码
image.png
以分配对象为例,可以看到代码如下
image.png
在分配的时候,首先判断 bit位是否为1,如果为1,则panic。由此可以猜到在访问的时候首先bit位置1,然后访问结束清0。继续跟代码如下,发现了置bit位,和清空的操作。
image.png
image.png
总结:
map的并发写panic机制如下
- 判断当前map是否在写(根据bit位是否为1),如果在,直接panic
- 如果没有则置 标志为1,开始写
- 写结束,标志清0。
当然这之中也会对状态进行多次判断,不重要,先忽略。
网友评论