Golang的map 是线程安全的吗?
Go语言的map
不是线程安全的。在并发情况下,对map
的读和写操作需要加锁,否则可能会因为并发操作引起的竞态条件导致程序崩溃。如果你需要在多个goroutine中访问和修改同一个map
,你需要使用锁来保证线程安全。
Go语言提供了sync
包中的sync.RWMutex
读写锁,或者使用sync.Map
来实现并发安全的map
。
下面是一个使用sync.RWMutex
的例子:
var m = make(map[string]int)
var mutex = &sync.RWMutex{}
// 写入数据到map
func write(key string, value int) {
mutex.Lock()
m[key] = value
mutex.Unlock()
}
// 从map中读取数据
func read(key string) (int, bool) {
mutex.RLock()
defer mutex.RUnlock()
value, ok := m[key]
return value, ok
}
在这个例子中,我们使用sync.RWMutex
读写锁来保护map
,在读取map
时使用读锁,在写入map
时使用写锁,这样就可以在并发环境下安全的使用map
了。