Go 的 map 在并发场景下,只读是线程安全的,读写则是线程不安全的。Go1.9 提供了并发安全的 sync.Map
,通过阅读源码我们知道 snyc.Map
通过读写分离的机制,降低了锁的粒度,以此来提高并发性能
并发不安全的 map
func main() {
m := make(map[int]int)
go func() {
for {
m[1] = 1
}
}()
go func() {
for {
_ = m[1]
}
}()
time.Sleep(time.Second * 10)
}
执行程序会报如下错误
$ go run main.go
fatal error: concurrent map read and map write
并发安全的 sync.Map
对于并发不安全的 map,一般这种情况我们可以通过加锁的方式来实现并发安全的 hashmap,但是锁本身也会带来额外的性能开销ÿ