MST
星途 面试题库

面试题:Go语言如何利用sync包解决Map并发读写

假设你有一个场景,多个goroutine需要并发读写一个Map,你打算使用`sync`包中的工具来解决并发问题,详细描述如何使用`sync.RWMutex`来实现,并写出对应的代码示例。
48.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用sync.RWMutex实现并发读写Map的原理
    • sync.RWMutex是读写锁,允许多个读操作并发执行,但只允许一个写操作执行,并且写操作执行时不允许有读操作。
    • 读操作使用RLock方法加读锁,RUnlock方法解锁;写操作使用Lock方法加写锁,Unlock方法解锁。
  2. 代码示例
package main

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.RWMutex
    data := make(map[string]int)

    var wg sync.WaitGroup

    // 模拟写操作
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            mu.Lock()
            key := fmt.Sprintf("key%d", id)
            data[key] = id
            fmt.Printf("Write: key %s set to %d\n", key, id)
            mu.Unlock()
        }(i)
    }

    // 模拟读操作
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            mu.RLock()
            for key, value := range data {
                fmt.Printf("Read: key %s has value %d\n", key, value)
            }
            mu.RUnlock()
        }(i)
    }

    wg.Wait()
}

在上述代码中:

  • 定义了一个sync.RWMutex类型的变量mu和一个map类型的变量data
  • 通过多个goroutine模拟写操作,在写操作前使用mu.Lock()加写锁,操作完成后使用mu.Unlock()解锁。
  • 通过多个goroutine模拟读操作,在读操作前使用mu.RLock()加读锁,操作完成后使用mu.RUnlock()解锁。
  • sync.WaitGroup用于等待所有goroutine完成操作。