go语言map实例不是并发安全的,并发读写会运行时panic
//充当map描述符角色的hmap自身是有状态的(hmap.flags),且对状态的读写并没有并发保护,
//因此map实列不是并发写安全的,不支持并发读写。如果对map实例进行并发读写,程序运行时会
//发生panic。
package main
import (
"fmt"
"time"
)
func doIteration(m map[int]int) {
for k, v := range m {
fmt.Printf("[%d, %d] ", k, v)
}
}
func doWrite(m map[int]int) {
for k, v := range m {
m[k] = v + 1
}
}
func main() {
m := map[int]int{
1: 11,
2: 22,
3: 33,
}
go func() {
for i := 0; i < 10000; i++ {
doIteration(m)
}
}()
go func() {
for i := 0; i < 10000; i++ {
doWrite(m)
}
}()
time.Sleep(time.Second * 3)
}
PS D:\goproject\main> go run map_concurrent_rd_wr.go [1, 11] [2, 1128] fatal error: concurrent map iteration and map write //从报错信息可以看出,并发读是可以的
Go语言基础及实战 文章被收录于专栏
Go语言学习笔记、语法知识、技术要点和个人理解及实战
查看19道真题和解析
