要实现阻塞读且并发安全的 map,可以使用 sync 包中的 Mutex 和 RWMutex 来实现。下面是一个示例代码:
package main
import (
"sync"
)
type SafeMap struct {
mu sync.RWMutex
items map[string]interface{}
}
func NewSafeMap() *SafeMap {
return &SafeMap{
items: make(map[string]interface{}),
}
}
func (s *SafeMap) Get(key string) interface{} {
s.mu.RLock()
defer s.mu.RUnlock()
return s.items[key]
}
func (s *SafeMap) Set(key string, value interface{}) {
s.mu.Lock()
defer s.mu.Unlock()
s.items[key] = value
}
func main() {
safeMap := NewSafeMap()
// 并发读取
go func() {
for i := 0; i < 10; i++ {
value := safeMap.Get("key")
println(value)
}
}()
// 并发写入
go func() {
for i := 0; i < 10; i++ {
safeMap.Set("key", i)
}
}()
select {}
}
在上面的示例中,SafeMap
结构体包含了一个 sync.RWMutex
来保证并发访问的安全性。Get()
方法使用 RLock()
进行读锁定,允许多个 goroutine 同时进行读取操作。而 Set()
方法使用 Lock()
进行写锁定,确保只有一个 goroutine 可以进行写入操作。
注意,在示例中使用了无限循环来模拟并发操作,你可以根据实际需求进行适当的修改。
内容由零声教学AI助手提供,问题来源于学员提问