MST
星途 面试题库

面试题:Go中Go RWMutex锁如何控制读锁粒度

在Go语言中使用RWMutex锁,假设你有一个场景,需要对一个数据结构进行读多写少的操作,如何通过控制读锁粒度来提高并发性能?请举例说明代码实现思路。
22.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 控制读锁粒度的思路
    • 在Go语言中,RWMutex 提供了读锁(RLock)和写锁(Lock)。对于读多写少的场景,尽量让读操作并行执行可以提高并发性能。可以通过在合适的代码块内使用读锁,尽量缩短读锁的持有时间,避免读锁长时间占用而影响写操作。
  2. 代码实现示例
package main

import (
    "fmt"
    "sync"
)

// 定义一个数据结构
type Data struct {
    mu    sync.RWMutex
    value int
}

// 读操作函数
func (d *Data) Read(wg *sync.WaitGroup) {
    defer wg.Done()
    d.mu.RLock()
    defer d.mu.RUnlock()
    fmt.Printf("Read value: %d\n", d.value)
}

// 写操作函数
func (d *Data) Write(wg *sync.WaitGroup, v int) {
    defer wg.Done()
    d.mu.Lock()
    defer d.mu.Unlock()
    d.value = v
    fmt.Printf("Write value: %d\n", d.value)
}

可以通过如下方式调用这些函数来演示读多写少场景下的锁使用:

func main() {
    var wg sync.WaitGroup
    data := Data{}

    // 模拟多个读操作
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go data.Read(&wg)
    }

    // 模拟一个写操作
    wg.Add(1)
    go data.Write(&wg, 10)

    wg.Wait()
}

在上述代码中,读操作使用 RLock 获取读锁,这样多个读操作可以并行执行。写操作使用 Lock 获取写锁,写锁会阻止其他读操作和写操作,以保证数据一致性。通过控制读锁的粒度,只在读取数据的关键代码块内持有读锁,提高了读多写少场景下的并发性能。