美文网首页
go map并发panic实现

go map并发panic实现

作者: lucasgao | 来源:发表于2021-03-30 22:42 被阅读0次

某厂面试

面试官:map是并发安全的吗?
我:不是
面试官:那并发访问会怎样
我:触发panic
面试官:那这个panic是怎么实现的。
我: 。。。。

当时猜测是根据一些标志位实现的,但是这块之前没有看过源码,面试结束后复习源码。
首先并发访问,报错:

concurrent map writes
根据相关报错信息,查找源码


image.png

以分配对象为例,可以看到代码如下


image.png
在分配的时候,首先判断 bit位是否为1,如果为1,则panic。由此可以猜到在访问的时候首先bit位置1,然后访问结束清0。继续跟代码如下,发现了置bit位,和清空的操作。
image.png
image.png

总结:
map的并发写panic机制如下

  1. 判断当前map是否在写(根据bit位是否为1),如果在,直接panic
  2. 如果没有则置 标志为1,开始写
  3. 写结束,标志清0。

当然这之中也会对状态进行多次判断,不重要,先忽略。

相关文章

网友评论

      本文标题:go map并发panic实现

      本文链接:https://www.haomeiwen.com/subject/fgsnhltx.html