目录
- 前言
- map 并发操作出现问题
- sync.map 解决并发操作问题
- 计算 map 长度
- 计算 sync.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的并发操作问题的文章就介绍到这了,更多相关go sync.map解决map并发操作内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
黄山市民网:https://www.huangshanshimin.com/