写点什么

Golang 并发安全 Map 容器实践

作者:俞凡
  • 2024-04-12
    上海
  • 本文字数:914 字

    阅读完需:约 3 分钟

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



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


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

使用锁同步访问 map

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


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 中读取数据之前锁定读写锁,之后将其解锁。在写入时,写锁将阻塞所有读写操作,直到写入完成。


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 容器。


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",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 4
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
Golang 并发安全Map容器实践_golang_俞凡_InfoQ写作社区