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
}

使用第三方软件包

gmapGoFrame 框架中的一个软件包,提供了高性能的并发安全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多平台发布

相关推荐
京东云开发者8 小时前
研发排查问题的利器:一款方法调用栈跟踪工具
程序员
京东云开发者8 小时前
JDD Oxygen智能零售论坛 | 《大模型时代的广告营销变革与实践》
程序员
京东云开发者8 小时前
常用Web 实时通信技术:原理+选型,一篇通关
程序员
技术爬爬虾11 小时前
AI编程新王Codex详细攻略,一期视频精通,附免费使用方法
程序员·github
大模型教程13 小时前
开源RAG神器RAGFlow深度解析:融合Agent能力,零门槛搭建企业级AI知识库
程序员·llm·agent
AI大模型13 小时前
斩获72k Star!谷歌云AI大牛开源LLM应用案例库,拿来即用
程序员·llm·agent
AI大模型13 小时前
GitHub斩获 19.9k 星!免费!从零开始系统学习大语言模型
程序员·llm·agent
大模型教程13 小时前
后悔没早点读!Sebastian Raschka 新书《从头开始推理》
程序员·llm·agent
SimonKing15 小时前
【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(四)!
java·后端·程序员
前端开发张小七2 天前
写个刚步入大学生活的弟弟的一封信
程序员