在 Go 语言的并发编程场景中,标准库中的map类型并不是并发安全的。当多个 goroutine 同时对map进行读写操作时,很容易引发竞态条件(race condition),导致程序出现不可预测的错误。为了解决这一问题,我们可以通过自定义结构体,结合读写锁来实现一个并发安全的map,本文就来详细介绍一种安全map的实现方法。
代码实现
Go
package main
import (
"sync"
)
type safeMap struct {
lock *sync.RWMutex
sm map[interface{}]interface{}
}
func newSafeMap() *safeMap {
return &safeMap{
lock: new(sync.RWMutex),
sm: make(map[interface{}]interface{}),
}
}
func (m *safeMap) Get(k interface{}) interface{} {
m.lock.RLock()
defer m.lock.RUnlock()
if val, ok := m.sm[k]; ok {
return val
}
return nil
}
func (m *safeMap) Set(k interface{}, v interface{}) bool {
m.lock.Lock()
defer m.lock.Unlock()
if val, ok := m.sm[k]; !ok {
m.sm[k] = v
} else if val != v {
m.sm[k] = v
} else {
return false
}
return true
}
func (m *safeMap) Check(k interface{}) bool {
m.lock.RLock()
defer m.lock.RUnlock()
if _, ok := m.sm[k]; !ok {
return false
}
return true
}
func (m *safeMap) Delete(k interface{}) {
m.lock.Lock()
defer m.lock.Unlock()
delete(m.sm, k)
}