MST

星途 面试题库

面试题:Go语言中Mutex锁在读写混合场景下如何优化使用

在Go语言中,假设你有一个应用场景,存在频繁的读操作和偶尔的写操作,使用Mutex锁来保护共享资源。请描述如何对这种读写混合场景进行优化,以提高程序性能,并给出相应的代码示例。
22.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 优化思路
    • 使用读写锁(sync.RWMutex)代替普通的互斥锁(Mutex)。sync.RWMutex允许并发读操作,只有在写操作时才会独占资源,从而提高频繁读操作场景下的性能。写操作时,会阻止其他读和写操作,以保证数据一致性。
  2. 代码示例
package main

import (
    "fmt"
    "sync"
)

// 定义一个共享资源结构体
type SharedResource struct {
    data  int
    rwmu  sync.RWMutex
}

// 读操作函数
func (sr *SharedResource) read() int {
    sr.rwmu.RLock()
    defer sr.rwmu.RUnlock()
    return sr.data
}

// 写操作函数
func (sr *SharedResource) write(newData int) {
    sr.rwmu.Lock()
    defer sr.rwmu.Unlock()
    sr.data = newData
}

func main() {
    var wg sync.WaitGroup
    shared := SharedResource{}

    // 模拟多个读操作
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            fmt.Println("Read:", shared.read())
        }()
    }

    // 模拟偶尔的写操作
    wg.Add(1)
    go func() {
        defer wg.Done()
        shared.write(42)
        fmt.Println("Write completed")
    }()

    wg.Wait()
}

在上述代码中:

  • SharedResource结构体包含一个int类型的共享数据data和一个读写锁rwmu
  • read方法使用RLock进行读锁定,允许多个读操作并发执行。
  • write方法使用Lock进行写锁定,在写操作时会独占资源,阻止其他读和写操作。