面试题答案
一键面试在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()
}
在上述代码中:
sync.RWMutex
类型的mu
用于保护myMap
。read
函数在读取myMap
时使用mu.RLock()
获取读锁,允许多个协程同时读取,提高并发性能,读取完成后使用mu.RUnlock()
释放读锁。write
函数在写入myMap
时使用mu.Lock()
获取写锁,确保在写入时没有其他协程进行读写操作,写入完成后使用mu.Unlock()
释放写锁。main
函数中通过wg
来等待所有协程完成操作。
通过这种方式,既可以保证多个协程并发读取map
时的数据一致性,又能让写操作正常进行。