基本原语
sync.Mutex与sync.RWMutex
互斥锁sync.Mutex比较暴力,一个协程锁住后,其他协程只能等待;而不管这个协程是读操作还是写操作.
读写(互斥)锁sync.RWMutex是细粒度的互斥锁, 它不限制资源的并发读. 但是读写、写写操作无法并行执行.
一个常见的服务对资源的读写比例会非常高,因为大多数的读请求之间不会相互影响,所以我们可以读写资源操作的分离,在类似场景下提高服务的性能。 读多写少的场景,推荐使用sync.RWMutex
二者的区别,有点类似mysql的排它锁(X锁/写锁)和共享锁(S锁/读锁)
sync.RWMutex的实现需要基于sync.Mutex
sync.Waitgroup
依赖了sync.Mutex
sync.Once
依赖了sync.Mutex
sync.Cond
sync.Cond-让一系列Goroutine在满足特定条件时被唤醒
依赖了sync.Mutex
扩展原语
ErrGroup
Semaphore
SingleFlight
SingleFlight-抑制对下游多次重复请求,防止缓存击穿的利器
番外:并发安全的几个工具
sync.Pool
sync.Map
参考:
原文链接: https://dashen.tech/2020/10/01/Golang同步原语与锁/
版权声明: 转载请注明出处.