【原理】

【map的线程不安全的原因】

在同一时间点,两个 goroutine 对同一个map进行读写操作是不安全的。举个栗子。

此时goroutine1来插入key1,goroutine2来读取key2,可能会发生如下过程:

① goroutine2 计算key2的hash值,B=2,并确定桶号为1。

② goroutine1添加key1,触发扩容条件。

③ B=B+1=3, buckets数据迁移到oldbuckets。

④ goroutine2从桶1中遍历,获取数据失败。