在使用 Go语言 进行并发编程时,map 是一个非常常用的数据结构。然而,很多初学者并不知道:Go 原生的 map 并不是 并发安全 的!如果多个 goroutine 同时对同一个 map 进行读写操作,程序很可能会崩溃,抛出 fatal error: concurrent map read and map write 错误。
Go 语言的设计哲学是“简单高效”,因此标准库中的 map 没有内置锁机制。这样做可以避免不必要的性能开销。但在多 goroutine 环境下,如果多个协程同时修改或读取同一个 map,就可能引发数据竞争(data race),导致程序异常终止。
package mainimport ( "fmt" "time")func main() { m := make(map[int]int) // 启动两个 goroutine 并发写入 map go func() { for i := 0; i < 1000; i++ { m[i] = i } }() go func() { for i := 1000; i < 2000; i++ { m[i] = i } }() time.Sleep(2 * time.Second) fmt.Println("程序结束")} 运行上述代码,有很大概率会看到类似下面的错误:
fatal error: concurrent map writes 最直接的方法是使用 sync.Mutex 或 sync.RWMutex 来保护 map 的访问。这样可以确保同一时间只有一个 goroutine 能读写 map。
package mainimport ( "fmt" "sync" "time")type SafeMap struct { mu sync.RWMutex m map[int]int}func (sm *SafeMap) Write(key, value int) { sm.mu.Lock() defer sm.mu.Unlock() sm.m[key] = value}func (sm *SafeMap) Read(key int) int { sm.mu.RLock() defer sm.mu.RUnlock() return sm.m[key]}func main() { safeMap := &SafeMap{m: make(map[int]int)} go func() { for i := 0; i < 1000; i++ { safeMap.Write(i, i) } }() go func() { for i := 1000; i < 2000; i++ { safeMap.Write(i, i) } }() time.Sleep(2 * time.Second) fmt.Println("程序安全结束")} 这种方法适用于大多数场景,但需要开发者手动管理锁,稍有不慎仍可能出错。
从 Go 1.9 开始,标准库提供了 sync.Map,它是专门为并发场景设计的 map 类型,内部通过无锁结构和原子操作优化了性能,特别适合读多写少的场景。
以下是使用 sync.Map 的示例:
package mainimport ( "fmt" "sync" "time")func main() { var sm sync.Map go func() { for i := 0; i < 1000; i++ { sm.Store(i, i) } }() go func() { for i := 1000; i < 2000; i++ { sm.Store(i, i) } }() // 读取一个值验证 time.Sleep(1 * time.Second) if val, ok := sm.Load(500); ok { fmt.Printf("Key 500 的值是: %v\n", val) } fmt.Println("使用 sync.Map 安全结束")} 注意:sync.Map 没有 len() 方法,也不能用 range 直接遍历(需使用 Range 方法)。它适用于特定的并发模式,不是所有场景都比带锁的 map 更快。
sync.Map 是更好的选择。在 Go语言并发安全 编程中,切记不要直接在多个 goroutine 中共享原生 map。掌握 sync.Mutex 和 sync.Map 的使用,是写出健壮并发程序的关键。本文介绍了两种主流解决方案,并提供了可运行的代码示例,帮助你轻松避开 Go map线程安全 的坑。
无论你是刚入门 Go并发编程 的新手,还是正在优化现有系统的开发者,理解并正确处理 map 的并发问题,都是必不可少的技能。希望这篇关于 sync.Map使用教程 的文章能为你提供清晰的指导!
本文由主机测评网于2025-12-23发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251211824.html