sync.Map 的使用和内置的 map 类型一样,只不过它是并发安全的,适合读多写少的场景。
常用使用方法
var m sync.Map
// 写入
m.store("Tom", 18)
m.store("Tim", 18)
age, exists := m.Load("Tom")
m.Delete("Tom")
m.Range(func(key, value interface{}) bool {
name := key.(string)
age := value.(int)
return true
})
sync.Map 和 Map + sync.Mutex 性能比较
TODO
sync.Map 为什么没有 len 方法?
bcmills 认为对于并发的数据结构和非并发的数据结构并不一定要有相同的方法。例如,map 有 Len 方法,sync.map 却不一定要有。就像 sync.map 有 LoadOrStore 方法,map 就没有一样。
有些实现增加了一个计数器,并原子地增加或减少它,以此来表示 sync.map 中元素的个数。但 bcmills 提出这会引入竞争:atomic 并不是 contention-free 的,它只是把竞争下沉到了 CPU 层级。这会给其他不需要 Len 方法的场景带来负担。