当前位置: > > > > 如何在 Golang 中锁定特定映射的索引以进行并发读/写
来源:stackoverflow
2024-04-19 21:27:31
0浏览
收藏
各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何在 Golang 中锁定特定映射的索引以进行并发读/写》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!
问题内容
我想知道是否有一种方法可以在并发读/写期间仅锁定映射中的索引。我对 golang 和并行性还很陌生,如果答案很明显,我很抱歉。
func check(a, b []string) map[string]int { var res = make(map[string]int) go func() { for _, v := range a { res[v]++ } }() go func() { for _, v := range b { res[v]++ } }() return res }
最终这段代码会由于并发的映射读/写而发生恐慌。所以我们应该添加互斥锁来锁定地图。
var m sync.Mutex go func() { for _, v := range a { m.Lock() res[v]++ m.Unlock() } }() go func() { for _, v := range b { m.Lock() res[v]++ m.Unlock() } }()
但是根据我的理解,m.lock()
会锁定我的整个地图?锁定所有内容是不是开销太大了?这让我很烦恼,因为我认为这段代码可能不会比线性运行更快。我可以只锁定 map["some key"]
处的映射,以便我的第二个 goroutine 仍然可以在 map["some other key"]
中写入吗?
解决方案
来自
并发地图
同步包中的新映射类型是具有摊销恒定时间加载、存储和删除的并发映射。多个 goroutine 同时调用 Map 的方法是安全的。
GO 团队为您打造了一款!
好了,本文到此结束,带大家了解了《如何在 Golang 中锁定特定映射的索引以进行并发读/写》,希望本文对你有所帮助!关注公众号,给大家分享更多Golang知识!