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

全部评论

相关推荐

05-21 15:47
门头沟学院 Java
浪漫主义的虹夏:项目有亮点吗,第一个不是纯玩具项目吗,项目亮点里类似ThreadLocal,Redis储存说难听点是花几十分钟绝大部分人都能学会,第二个轮子项目也没体现出设计和技术,想实习先沉淀,好高骛远的自嗨只会害了自己
点赞 评论 收藏
分享
06-05 19:46
已编辑
武汉大学 后端
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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