Golang 并发安全Map容器实践

Golang原生Map容器并非支持并发安全,在实际使用的时候很容易导致条件竞争并造成未知问题,本文介绍了在Golang中如何安全的并发访问Map容器。原文: Concurrent-Safe Map Container in Go

当多个程序同时尝试写入同一个map时,就会出现并发问题,从而导致竞争以及不可预测的行为。

本文将列出一些解决这一问题的方法。

使用锁同步访问map

在读取或写入map前锁定mutex,并在读取或写入map后解锁mutex。这样可以确保一次只能有一个 goroutine 访问map。

golang 复制代码
var (
  m = make(map[string]int)
  mutex = sync.Mutex{}
)

func readFromMap(key string) int {
    mutex.Lock()
    defer mutex.Unlock()
    return m[key]
}

func writeToMap(key string, value int) {
    mutex.Lock()
    defer mutex.Unlock()
    m[key] = value
}

使用读写锁,允许多个读操作同时访问map,但只能有一个写操作

从map中读取数据之前锁定读写锁,之后将其解锁。在写入时,写锁将阻塞所有读写操作,直到写入完成。

golang 复制代码
var (
  m = make(map[string]int)
  rwMutex = sync.RWMutex{}
)

func readFromMap(key string) int {
    rwMutex.RLock()
    defer rwMutex.RUnlock()
    return m[key]
}

func writeToMap(key string, value int) {
    rwMutex.Lock()
    defer rwMutex.Unlock()
    m[key] = value
}

使用第三方软件包

gmap 是 GoFrame 框架中的一个软件包,提供了高性能的并发安全map容器。

golang 复制代码
var m = gmap.New(true)

func readFromMap(key string) int {
   return m.Get(key).(int)
}

func writeToMap(key string, value int) {
   m.Set(key, value)
}

以上是 Golang 并发读写map容器的几种解决方案,此外还有很多其他方法,最佳解决方案取决于具体用例和需求。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

本文由mdnice多平台发布

相关推荐
青衫嵌入式2 小时前
用 STM32 搞清楚 FreeRTOS 的任务上下文到底是什么
物联网·程序员
Solara10 小时前
进推荐流的文章不是快 1.42 倍,是 3.36 倍:我把错的数写进了长期记忆
人工智能·程序员·ai编程
2601_9679791211 小时前
当代码有了温度:程序员的键盘上,藏着人间烟火
程序员·生活·技术·代码·温情
leobertlan1 天前
杂篇 -- 拂拭念头、造器与自洽:AI 时代属于每个人的秩序
人工智能·程序员
墨狂之逸才1 天前
忘记电视 IP 之后:一次从零开始的 Mac 局域网与 ADB 学习记录
程序员
高晶1 天前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶1 天前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
用户235937172631 天前
第2周:搜索流量开始来了——小程序SEO的收录机制与排名调优实录
程序员·运营
米米商聊1 天前
看起来一样的词,为什么搜不到?Unicode 规范化与搜索键
程序员
xunberg1 天前
【生命科学 Agent】推理平台(三)
算法·程序员·架构