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

全部评论

相关推荐

感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务