面试题答案
一键面试为了确保在多线程环境下对共享 map
进行读写操作的安全性,我们可以使用 sync.RWMutex
。RWMutex
允许读操作并发执行,但写操作会独占锁,从而避免数据竞争。
以下是具体实现代码:
package main
import (
"fmt"
"sync"
)
type SafeMap struct {
mu sync.RWMutex
data map[string]interface{}
}
func NewSafeMap() *SafeMap {
return &SafeMap{
data: make(map[string]interface{}),
}
}
func (sm *SafeMap) Get(key string) (interface{}, bool) {
sm.mu.RLock()
defer sm.mu.RUnlock()
value, exists := sm.data[key]
return value, exists
}
func (sm *SafeMap) Set(key string, value interface{}) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.data[key] = value
}
func main() {
safeMap := NewSafeMap()
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
safeMap.Set("key1", "value1")
}()
go func() {
defer wg.Done()
value, exists := safeMap.Get("key1")
if exists {
fmt.Println("Value:", value)
}
}()
wg.Wait()
}
在上述代码中:
- 定义了一个
SafeMap
结构体,其中包含一个sync.RWMutex
和一个map
。 NewSafeMap
函数用于初始化SafeMap
。Get
方法使用RLock
进行读操作,允许多个读操作并发执行。Set
方法使用Lock
进行写操作,确保写操作的原子性,避免数据竞争。- 在
main
函数中,通过启动两个 goroutine 来演示并发读写操作的安全性。