服务器之家

服务器之家 > 正文

Go使用sync.Map来解决map的并发操作问题

时间:2021-11-26 11:37     来源/作者:新亮笔记

前言

在 Golang 中 map 不是并发安全的,自 1.9 才引入了 sync.Map ,sync.Map 的引入确实解决了 map 的并发安全问题,不过 sync.Map 却没有实现 len() 函数,如果想要计算 sync.Map 的长度,稍微有点麻烦,需要使用 Range 函数。

map 并发操作出现问题

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 解决并发操作问题

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 长度

?
1
2
3
4
5
6
7
8
9
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 长度

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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并发操作内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7024767670276849701

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部