互斥锁
应用场景:防止同一个goroutine,对数据进行操作
var lock sync.Mutex
lock.Lock()
lock.Unlock()
读写互斥锁
应用场景:读>写 的场景很多
特点:
1.读的场景,后续的goroutine来了,能读不能写
2.写的场景,厚度的goroutine来了,不管是读还是写,都需要等待
var rwLock sync.RWMutex
rwLock.RLock() // 读锁
rwLock.RUnlock()
rwLock.Lock()
rwLock.Unlock()
等待组
var wg sync.WaitGroup
wg.Add(n) // 启动几个goroutine,就add几个
wg.Done() // 完成一个goroutine,就done一次,数量-1
wg.Wait() // 所有goroutine结束,一共等待的时间
sync.Once
使用场景:goroutine中只执行一次,例如加载配置文件
var once sync.Once
once.Do(f()) // 方法只能接收:没有参数、没有返回值的函数。很可能会需要写闭包
sync.Map
一般map,在启动超过20个goroutine,就回警告报错。
特点:goroutine安全的map
含有几个方法:Store,Load,StoreOrLoad,Delete,Range
var syncMap sync.Map
syncMap.Store(key, value)
syncMap.Load()
atomic包:原子操作
var i int64
atomic.AddInt64(&i, 100)