MST

星途 面试题库

面试题:Go语言中如何使用`sync.RWMutex`来实现Map的并发安全读操作

在Go语言里,已知有一个普通的Map,例如`myMap := make(map[string]int)`,请描述如何使用`sync.RWMutex`来确保多个协程并发读取这个Map时的数据一致性,同时不影响写操作的正常进行。请给出相应的代码示例。
18.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,使用sync.RWMutex来确保多个协程并发读取map时的数据一致性,同时不影响写操作的正常进行,可以参考以下代码示例:

package main

import (
	"fmt"
	"sync"
)

var (
	myMap  = make(map[string]int)
	mu     sync.RWMutex
	wg     sync.WaitGroup
)

func read(key string) {
	defer wg.Done()
	mu.RLock()
	value, exists := myMap[key]
	mu.RUnlock()
	if exists {
		fmt.Printf("Read key: %s, value: %d\n", key, value)
	} else {
		fmt.Printf("Key %s not found\n", key)
	}
}

func write(key string, value int) {
	defer wg.Done()
	mu.Lock()
	myMap[key] = value
	mu.Unlock()
	fmt.Printf("Write key: %s, value: %d\n", key, value)
}

func main() {
	keys := []string{"a", "b", "c"}
	values := []int{1, 2, 3}

	// 模拟写操作
	for i := range keys {
		wg.Add(1)
		go write(keys[i], values[i])
	}

	// 模拟读操作
	for _, key := range keys {
		wg.Add(1)
		go read(key)
	}

	wg.Wait()
}

在上述代码中:

  1. sync.RWMutex类型的mu用于保护myMap
  2. read函数在读取myMap时使用mu.RLock()获取读锁,允许多个协程同时读取,提高并发性能,读取完成后使用mu.RUnlock()释放读锁。
  3. write函数在写入myMap时使用mu.Lock()获取写锁,确保在写入时没有其他协程进行读写操作,写入完成后使用mu.Unlock()释放写锁。
  4. main函数中通过wg来等待所有协程完成操作。

通过这种方式,既可以保证多个协程并发读取map时的数据一致性,又能让写操作正常进行。