面试题答案
一键面试- 使用
sync.RWMutex
实现并发读写Map的原理:sync.RWMutex
是读写锁,允许多个读操作并发执行,但只允许一个写操作执行,并且写操作执行时不允许有读操作。- 读操作使用
RLock
方法加读锁,RUnlock
方法解锁;写操作使用Lock
方法加写锁,Unlock
方法解锁。
- 代码示例:
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完成操作。