Go如何用sync.Map处理map的并发操作问题
导读:这篇文章给大家分享的是“Go如何用sync.Map处理map的并发操作问题”,文中的讲解内容简单清晰,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下“Go如何用sync.Map处理map的并发操...
这篇文章给大家分享的是“Go如何用sync.Map处理map的并发操作问题”,文中的讲解内容简单清晰,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下“Go如何用sync.Map处理map的并发操作问题”吧。
在 Golang 中 map 不是并发安全的,自 1.9 才引入了 sync.Map ,sync.Map 的引入确实解决了 map 的并发安全问题,不过 sync.Map 却没有实现 len() 函数,如果想要计算 sync.Map 的长度,稍微有点麻烦,需要使用 Range 函数。
map 并发操作出现问题
func main() { demo := make(map[int]int) go func() { for j := 0; j 1000; j++ { demo[j] = j } } () go func() { for j := 0; j 1000; j++ { fmt.Println(demo[j]) } } () time.Sleep(time.Second * 1) }
执行输出:
fatal error: concurrent map read and map write
sync.Map 解决并发操作问题
func main() { demo := sync.Map{ } go func() { for j := 0; j 1000; j++ { demo.Store(j, j) } } () go func() { for j := 0; j 1000; j++ { fmt.Println(demo.Load(j)) } } () time.Sleep(time.Second * 1) }
执行输出:
nil>
false
1 true
...
999 true
计算 map 长度
func main() { demo := make(map[int]int) for j := 0; j 1000; j++ { demo[j] = j } fmt.Println("len of demo:", len(demo)) }
执行输出:
len of demo: 1000
计算 sync.Map 长度
func main() { demo := sync.Map{ } for j := 0; j 1000; j++ { demo.Store(j, j) } lens := 0 demo.Range(func(key, value interface{ } ) bool { lens++ return true } ) fmt.Println("len of demo:", lens) }
执行输出:
len of demo: 1000
小结
- Load 加载 key 数据
- Store 更新或新增 key 数据
- Delete 删除 key 数据
- Range 遍历数据
- LoadOrStore 如果存在 key 数据则返回,反之则设置
- LoadAndDelete 如果存在 key 数据则删除
以上就是关于“Go如何用sync.Map处理map的并发操作问题”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注网络,小编每天都会为大家更新不同的知识。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Go如何用sync.Map处理map的并发操作问题
本文地址: https://pptw.com/jishu/653592.html