苹果CMS模板-专注于影视网站模板而生-模板壁
当前位置: 首页 使用教程 Go使用sync.Map来解决map的并发操作问题
Go使用sync.Map来解决map的并发操作问题

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

起风了 使用教程 评论0次 1970-01-01 2022-11-25
322
增值服务
免费下载说明:若侵犯到你的版权利益,请联系我们网站底部给予删除处理!
特别声明:☆ 所有资源仅供学习与参考,请勿用于商业用途。 ☆ 只提供下载服务,自行安装和试用,不提供任何技术支持。 ☆ 资源均为网络收集,不保证资源的完整性、可用性、安全性。 ☆ 禁止恶意使用本站资源从事违法行为,一律用于者承担。 ☆ 如果您不同意以上条款,请不要继续使用本站提供的服务。 ☆ 提示需要赞助付费的资源,请自行判断谨慎购买。 ☆ 如有侵犯您的版权,请及时联系我们,我们将下架处理。 ☆ 模板/源码资源需要您有一定开发基础,小白建议购买正版服务。
详情内容

前言

在 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并发操作内容请搜索M135模板网以前的文章或继续浏览下面的相关文章希望大家以后多多支持M135模板网!

1. 本站部分资源来源于用户上传和网络,如有侵权请联系站长删除! 2. 本站提供的资源,都不包含技术服务请大家谅解! 3. 如有链接无法下载或失效,请联系管理员处理! 4. 如未特别注明,如遇到无法解压的请联系管理员!

猜您喜欢坚持每天更新,让您每天都有新鲜的资源下载

4254资源个数(个)
2本月更新(个)
0本周更新(个)
0今日更新(个)