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语言学习笔记、语法知识、技术要点和个人理解及实战