Golang 锁

hashmap 和 sync.Map 皆为 unscalable:并发执行 hashmap 的插入操作,因为锁的存在,使用越多cpu,平均操作耗时越长。用 sync.Map 比用 hashmap+锁 的平均操作耗时更长。一、数据竞争原因:多个 goroutine 同时接触一个变量,行为不可预知认定条件:两个及以上 goroutine 同时接触一个变量,其中至少一个 goroutine 为写操作检测方案:go run -race 或者 go test -race二、锁的最佳实践减少持有时间:.
摘要由CSDN通过智能技术生成

hashmap 和 sync.Map 皆为 unscalable:并发执行 hashmap 的插入操作,因为锁的存在,使用越多cpu,平均操作耗时越长。用 sync.Map 比用 hashmap+锁 的平均操作耗时更长。

一、数据竞争

原因:多个 goroutine 同时接触一个变量,行为不可预知
认定条件:两个及以上 goroutine 同时接触一个变量,其中至少一个 goroutine 为写操作
检测方案:go run -race 或者 go test -race

二、锁的最佳实践

  1. 减少持有时间:使用 defer 释放锁的时候注意不要增加临界区(尽量用完了就尽快解锁,而defer会在函数最后才被执行,虽然不会忘记解锁,但是加大了持有时间)
  2. 优化锁的粒度:空间换时间。map 分段锁,比如一个数组长度为x,可以创建一个长度为x的 lock 数组分别对每个位置元素加锁,利用下标控制对应的锁。
  3. 读写分离:尽量使用读写锁 RWMutex,不管读多写少或者读少写多的场景,相比于 sync.Mutex 仍然会有不少的性能提升;sync.Map 相比于 RWMutex 在 cpu 核数增加时性能更稳定,也是推荐使用。
  4. 使用原子操作(Lock Free):使用 Go 提供的 atomic.Value。不触发调度,不阻塞执行流。相当于没有命中缓存的访存指令。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值