Golang同步原语与锁

基本原语


sync.Mutex与sync.RWMutex


互斥锁sync.Mutex比较暴力,一个协程锁住后,其他协程只能等待;而不管这个协程是读操作还是写操作.

读写(互斥)锁sync.RWMutex是细粒度的互斥锁, 它不限制资源的并发读. 但是读写、写写操作无法并行执行.

一个常见的服务对资源的读写比例会非常高,因为大多数的读请求之间不会相互影响,所以我们可以读写资源操作的分离,在类似场景下提高服务的性能。 读多写少的场景,推荐使用sync.RWMutex

二者的区别,有点类似mysql的排它锁(X锁/写锁)和共享锁(S锁/读锁)


sync包–Mutex

sync.RWMutex的实现需要基于sync.Mutex




sync.Waitgroup


sync包-Waitgroup实现原理

依赖了sync.Mutex




sync.Once


sync.Once-保证运行期间的某段代码只会执行一次

依赖了sync.Mutex




sync.Cond


sync.Cond-让一系列Goroutine在满足特定条件时被唤醒

依赖了sync.Mutex




扩展原语


ErrGroup


ErrGroup-有错误返回的Goroutine控制




Semaphore


Semaphore-带权重的信号量




SingleFlight


SingleFlight-抑制对下游多次重复请求,防止缓存击穿的利器




番外:并发安全的几个工具


sync.Pool


sync包-Pool




sync.Map


sync包-Map

golang之map并发访问




参考:

同步原语与锁