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

全部评论

相关推荐

有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
LemontreeN:有的兄弟有的我今天一天面了五场,4个二面一个hr面
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务