如果面试被问到这个问题,你该怎么回答呢?
首先回答:不是线程安全的
并发写入
来,我们先瞅一段代码
这段代码逻辑很简单:
- 定义了一个 map
- 起了一个协程,循环往 map 中数据(匿名函数)
- 主进程 main 函数同时操作 map,循环往 map 中写数据
执行结果是什么呢?
可以看到,运行失败了。失败原因:并发写入
并发读写
如果是并发读写,代码变成下面这样
同样会运行失败,错误变成了并发读写失败
所以在平时写代码的时候,一定要小心这个坑哟!
比如我们定义了一个 map,放到两个 goroutine 中异步执行,并发读写/并发写入(同时读没有问题),就会踩坑
go 中的 race 检测
为了防止存在并发隐患,我们还可以通过 -race 检测是否存在竞态(一般在测试阶段使用)
比如下面这段代码,直接测试运行一般是没有问题的,因为(同一时间写map的几率特别小),但是通过检测就能看出来,存在并发隐患