如果面试被问到这个问题,你该怎么回答呢?

首先回答:不是线程安全的


并发写入

来,我们先瞅一段代码

这段代码逻辑很简单:

  • 定义了一个 map
  • 起了一个协程,循环往 map 中数据(匿名函数)
  • 主进程 main 函数同时操作 map,循环往 map 中写数据

执行结果是什么呢?

可以看到,运行失败了。失败原因:并发写入


并发读写

如果是并发读写,代码变成下面这样

同样会运行失败,错误变成了并发读写失败

所以在平时写代码的时候,一定要小心这个坑哟!

比如我们定义了一个 map,放到两个 goroutine 中异步执行,并发读写/并发写入(同时读没有问题),就会踩坑


go 中的 race 检测

为了防止存在并发隐患,我们还可以通过 -race 检测是否存在竞态(一般在测试阶段使用)

比如下面这段代码,直接测试运行一般是没有问题的,因为(同一时间写map的几率特别小),但是通过检测就能看出来,存在并发隐患