golang_day8-互斥锁-sync

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

互斥锁

应用场景:防止同一个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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值