今天在面试过程中遇到了一个问题:map在并发时怎么保证一致性(简化后的问题)。
这里记录一下
2大map
一个是老的map类型
一个是1.9版之后的sync.map
老的map解决办法比如 使用互斥锁,使用channel进行封装(太麻烦),sync.WaitGroup也是一个不错的选择
sync.map里面有一些常用方法需要了解一下:
func syncMap(){
var sm sync.Map
//向a这个key里面存111
sm.Store("a",111)
//读值
sm.Load("a")
//有"a"就load,没有就保存
sm.LoadOrStore("a",2)
//删除key
sm.Delete("a")
//便利循环sync.map
sm.Range(func(key, value interface{}) bool {
fmt.Printf("%v", value)
})
}
接下来是源码解读:
https://blog.csdn.net/meifannao789456/article/details/106710554
总结一下:
sync.Map的核心实现:就是2个map,一个用于读,一个用于写
sync.Map的局限性:如果写远高于读,建议直接用sync.mutex+map
sync.Map的特点:1.保证高频读的无锁、2.空间换时间的做法