这篇文章给大家分享的是“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的并发操作问题”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。