资讯动态

Go读写锁实战:性能提升的秘密武器

发布时间:2026/10/7 2:49:05 来源:尧图企业网站定制
一、这是一个叫做同步, 也就是读写锁的东西。sync. 是 Go 里非常重要的一种锁核心目标就一句话在读的操作比较多的, 写的操作比较少的那种场合下面, 想要把并发方面的性能给提上去。这就是读写锁, 也就是我们常说的Read-Write Lock。它将锁这种物件切分为了两种不同的类型。二、核心的规则之一是在进行读取操作的时候可以执行并发的处理。goroutine ARLockgoroutine BRLock→ 可以同时执行2️⃣ 读-写 互斥ARLockBLock→ B 必须等 A 释放第三步是进行书的撰写工作, 这一环节需要保持互斥的特性。ALockBLock→ B 等 A第四, 进行书写的优先安排。一旦发现有正在等待写入锁定的情况。新的读请求会被阻塞目的避免“写饿死”三、基本用法var rw sync.RWMutex读操作rw.RLock()defer rw.RUnlock()// 读数据写操作rw.Lock()defer rw.Unlock()// 修改数据四、这个是有关于在使用map的时候需要注意并发安全的示例。这是最经典场景var m make(map[int]int)var rw sync.RWMutex// 读func get(key int) int {rw.RLock()defer rw.RUnlock()return m[key]}// 写func set(key, val int) {rw.Lock()defer rw.Unlock()m[key] val}五、内部原理内部维护关于工作流程部分, 我们需要先进行加读锁操作, 然后释放这个读锁, 接着再去执行加写锁的步骤。接下来进入第六部分, 也就是常见的坑。在坑1这一点上, 要特别注意读锁是可以升级为写锁的, 但是这个升级过程会导致系统陷入死锁的状态。rw.RLock()rw.Lock() // 死锁原因第二, 有一个深坑, 就是尝试把写锁给降成读锁, 在Go编程语言里面, 这是不被支持的。rw.Lock()rw.RLock() // 不安全/不支持Go 没有锁降级机制不像 Java坑三: 读取数据与写入数据分别采用两把独立的锁。var r sync.Mutexvar w sync.Mutex这样会导致第四个坑, 就是没有去执行解锁这个操作。rw.RLock()if something {return // 忘记 RUnlock}正确rw.RLock()defer rw.RUnlock()七、性能分析这项功能, 是在什么时候进行使用的呢? 它非常适合于被应用的场合。例如读1000 次/秒写10 次/秒这一种情况不太适合去做内容写得过多或者过于充实的事情。写锁一旦加上, 就会把所有的读取操作统统给挡住。2️⃣ 读写频率接近不如去改用一下那个Mutex。八、 vs Mutex经验法则如果遇到不确定的情况, 不妨直接使用Mutex, 而确认读操作占多数的时候再换。九、提供一个比较直观的理解方式, 这种理解方式可以用来帮助记忆。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑