sync包
sync包是 golang 一个官方的异步库,提供了一些各种基础的异步的实现,如互斥锁等。sync 包主要包括了以下几种类型:
- sync.Mutex 和 sync.WaitGroup
- sync.Once
- sync.Map
- sync.Pool
- sync.Cond
sync.Once
sync.Map
sync.Map
是一个线程安全的map结构,一般用于多读少写的并发操作,下图是sync.Map
的数据结构
图引至码农桃花源公众号
type Map struct { |
mu
是Map
的互斥锁用于对并发操作进行加锁保护,read
是用于存储只读内容的,可以提供高并发的读操作。 dirty
是一个原始的map
结构体,对dirty
的操作需要加锁,dirty
包涵了全量的数据,在读数据的时候会先读取read
,read
读取不到再读dirty
。 misses
是read
读取失败的次数,当多次读取失败后 misses
累计特定值,dirty
就会升级成read
。sync.Map
这里采用的策略类似数据库常用的”读写分离”,技术都是相通的O(∩_∩)O
sync.Map用法
func main() { |