分片加锁 尽量减少锁的粒度和锁的持有时间
09 | map:如何实现线程安全的map类型? https://time.geekbang.org/column/article/301174
Go 内建的 map 对象不是线程(goroutine)安全的,并发读写的时候运行时会有检查,遇到并发问题就会导致 panic。
我们一起看一个并发访问 map 实例导致 panic 的例子:
一些知名的项目中也是屡次出现这个问题,比如 Docker issue 40772,在删除 map 对象的元素时忘记了加锁:
Docker issue 40772,Docker issue 35588、34540、39643 等等,也都有并发读写 map 的问题。除了 Docker 中,Kubernetes 的 issue 84431、72464、68647、64484、48045、45593、37560 等,以及 TiDB 的 issue 14960 和 17494 等,也出现了这个错误。