互斥锁
应用场景:防止同一个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)
本文深入探讨了Go语言中的并发控制工具,包括互斥锁、读写锁、等待组和sync.Once。互斥锁(sync.Mutex)用于保护数据避免同一时间被多个goroutine修改;读写锁(sync.RWMutex)在读多写少的场景下提供更高的效率,允许多个goroutine同时读取但独占写入;等待组(sync.WaitGroup)确保所有goroutine执行完毕后再继续执行;sync.Once确保某个函数在整个程序运行期间只执行一次,常用于初始化。此外,还提到了原子操作(atomic包)在并发环境中的应用,保证了对变量操作的原子性。
4151

被折叠的 条评论
为什么被折叠?



