sync.Map是一个线程安全的map结构,一般用于多读少写的并发操作,今天带大家从源码看懂sync.Map
sync.Map是一个线程安全的map结构,一般用于多读少写的并发操作,下图是sync.Map的数据结构
![9f0e2131d6dfe465bc235500bc4a40da.png](https://img-blog.csdnimg.cn/img_convert/9f0e2131d6dfe465bc235500bc4a40da.png)
图引至码农桃花源公众号
type Map struct {mu Mutexread atomic.Value // readOnlydirty map[interface{}]*entrymisses int}
mu是Map的互斥锁用于对并发操作进行加锁保护,read是用于存储只读内容的,可以提供高并发的读操作。 dirty是一个原始的map结构体,对dirty的操作需要加锁,dirty包含了全量的数据,在读数据的时候会先读取read,read读取不到再读dirty。 misses 是read读取失败的次数,当多次读取失败后 misses 累计特定值,dirty就会升级成read。sync.Map 这里采用的策略类似数据库常用的”读写分离”,技术都是相通的O(∩_∩)O
sync.Map用法
func main() {var value sync.Map// 写入value.Store("your name", "shi")value.Store("her name", "kanon")// 读取name, ok := value.Load("your name")if !ok {println("can't find name")}fmt.Println(name)// 遍历value.Range(func(ki, vi interface{}) bool {k, v := ki.(string), vi.(string)fmt.Println(k, v)return true})// 删除value.Delete("your name")/