导航
Golang sync.Map 详解
原生的 Go Map 在并发读写场景下经常会遇到 panic 的情况。造成的原因是 map 是非线性安全的,并发读写过程中 map 的数据会被写乱。
而一般情况下,解决并发读写 map 的思路是加锁,或者把一个 map 切分成若干个小 map,对 key 进行哈希。
在业界中使用最多并发指出的模式分别是:
- 原生 map + 互斥锁 或者 读写锁
- 标准库 sync.Map (Go 1.9 及之后)
简单的介绍一下 Golang Map
Go 语言中 map 是一个 key(索引)和 value(值)形式的无序集合,也可以称为关联数组或字典;Golang中的 map 所有的 key 都是不同,通过给定的 key 可以在常数时间复杂度内检索、更新或删除对应的 value。
Golang map 的 key 是任何可以使用 ==
进行比较的数据类型,如 int、string、bool
等,value 可以是任意类型。
Map是一种无序的数据结构,因此 map 的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。
Map 使用
// 声明
var mapName map[keyType]valueType
// 创建
mapName = make(map[keyType]valueType, len) // 需要声明
mapName := make(map[keyType]valueType, len) // 声明+创建
// 循环遍历
for key, value := range mapName{
}
// 删除
delete(mapName, "Key")
sync.Map
sync.Map 是什么
Go 语言原生 map 是非线性安全的,对 map 进行并发读写操作时,需要加锁。在 Go 1.9 引入 sync.map,一种并发安全的 map。
sync.map 是线性安全的,读取、插入、删除都保持常数级的时间复杂度。
sync.map 的零值是有效的,并且零值是一个空的 map。在第一次使用之后,不允许被拷贝。