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

 更新时间:2021年10月31日 10:27:52   作者:新亮笔记  
在 Golang 中 map 不是并发安全的,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的并发操作问题的文章就介绍到这了,更多相关Go sync.Map解决map并发操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Go语言实现压缩文件处理

    基于Go语言实现压缩文件处理

    在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求,本文将介绍如何使用 Go 语言封装一个 ziputil 包,来处理文件的压缩和解压操作,需要的可以了解下
    2024-11-11
  • Go语言实现顺序存储的线性表实例

    Go语言实现顺序存储的线性表实例

    这篇文章主要介绍了Go语言实现顺序存储的线性表的方法,实例分析了Go语言实现线性表的定义、插入、删除元素等的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • go micro微服务框架项目搭建方法

    go micro微服务框架项目搭建方法

    这篇文章主要为大家介绍了go micro微服务框架项目搭建方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • go select编译期的优化处理逻辑使用场景分析

    go select编译期的优化处理逻辑使用场景分析

    select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。接下来通过本文给大家介绍go select编译期的优化处理逻辑使用场景分析,感兴趣的朋友一起看看吧
    2021-06-06
  • Go设计模式之观察者模式讲解和代码示例

    Go设计模式之观察者模式讲解和代码示例

    观察者是一种行为设计模式, 允许一个对象将其状态的改变通知其他对象,观察者模式提供了一种作用于任何实现了订阅者接口的对象的机制, 可对其事件进行订阅和取消订阅,本文就通过代码示例给大家详细介绍一下Go的观察者模式,需要的朋友可以参考下
    2023-07-07
  • Golang 正则匹配效率详解

    Golang 正则匹配效率详解

    这篇文章主要介绍了Golang 正则匹配效率详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • golang字符串拼接实现方式和区别对比

    golang字符串拼接实现方式和区别对比

    本文介绍了Go语言中字符串拼接的多种方法及其优缺点,推荐使用strings.Builder进行频繁拼接以优化内存分配和性能,同时,还讨论了通过sync.Pool优化高频创建的对象,以减少垃圾回收压力,感兴趣的朋友一起看看吧
    2025-02-02
  • Golang如何快速删除map所有元素

    Golang如何快速删除map所有元素

    这篇文章主要介绍了Golang如何快速删除map所有元素问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • golang实现ping命令的完整代码

    golang实现ping命令的完整代码

    这篇文章给大家介绍了如何使用golang实现ping命令,文中给大家介绍了完整的实现代码,并有详细的图文讲解,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Golang实现超时退出的三种方式

    Golang实现超时退出的三种方式

    这篇文章主要介绍了Golang三种方式实现超时退出,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论