Golang实现并发安全的Map
2022-11-13 14:10
Words count:
5715
最近在做一个用go实现redis的项目, 发现并发map是一个有意思的问题, 所以就写下一篇文章记录一下, 顺便分析一下官方的sync.Map源码, 并且写了一个比官方sync.Map性能更高的并发安全Map
Map是一种数据结构,方便我们以O(1)的时间复杂度去根据...
最近在做一个用go实现redis的项目, 发现并发map是一个有意思的问题, 所以就写下一篇文章记录一下, 顺便分析一下官方的sync.Map源码, 并且写了一个比官方sync.Map性能更高的并发安全map
Map是一种数据结构,方便我们以O(1)的时间复杂度去根据key查找value,但golang底层的Map却是并发不安全的, 不安全的并发是什么意思?即当两个线程(协程)同时更改一个数据时会出现数据的竞争的问题.
先来看一段程序
package main
func main() {
m := make(map[int]int)
go func() {
for {
_ = m[1]
}
}()
go func() {
for {
m[1] = 1
}
}()
select {}
}
# 同时读写map
fatal error: concurrent map read and map write
可见go的原生map有并发读写的问题
这时候需要加锁去实现安全问题.可以加读写锁去更方便的去加数据. 比如
type Map struct {
rWMutex sync.RWMutex
m map[string]int
}
var m Map
m.rWMutex.RLock()
n := m.m["some_key"]
m.rWMutex.RUnlock()
fmt.Println("some_key:", n)
m.rWMutex.Lock()
m.m["some_key"]++
m.rWMutex.Unlock()
3
times bought,
0
times reward
Comments