目录
  • 前言
  • 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!