Go中实现并发安全map需根据场景选择方案:读多写少可用sync.RWMutex保护普通map,提升性能;高并发读写且键不冲突可选sync.Map,但不宜频繁更新同一key;sync.Map不支持原子遍历,需用Range方法。

在Go语言中,原生的map并不是并发安全的。多个goroutine同时读写同一个map会触发Go的竞态检测机制,导致程序崩溃或数据异常。要实现并发安全的map操作,必须引入同步机制或使用标准库提供的并发安全结构。
最常见的做法是通过sync.RWMutex来保护普通map的读写操作。读操作使用RLock(),写操作使用Lock(),可以有效提升读多写少场景下的性能。
下面是一个封装好的并发安全map示例:
type ConcurrentMap struct {
m map[string]interface{}
mu sync.RWMutex
}
func NewConcurrentMap() *ConcurrentMap {
return &ConcurrentMap{
m: make(map[string]interface{}),
}
}
func (cm *ConcurrentMap) Set(key string, value interface{}) {
cm.mu.Lock()
defer cm.mu.Unlock()
cm.m[key] = value
}
func (cm *ConcurrentMap) Get(key string) (interface{}, bool) {
cm.mu.RLock()
defer cm.mu.RUnlock()
val, ok := cm.m[key]
return val, ok
}
func (cm *ConcurrentMap) Delete(key string) {
cm.mu.Lock()
defer cm.mu.Unlock()
delete(cm.m, key)
}
这种方式灵活、易于理解,适合大多数需要自定义行为的场景。
立即学习“go语言免费学习笔记(深入)”;
Go 1.9 引入了sync.Map,专为高并发读写设计。它适用于以下场景:
Inworld.ai
InWorldAI是一个AI角色开发平台,开发者可以创建具有自然语言、上下文意识和多模态的AI角色,并可以继承到游戏和实时媒体中
178
查看详情
sync.Map的API略有不同:
var m sync.Map
// 写入
m.Store("name", "Alice")
// 读取
if val, ok := m.Load("name"); ok {
fmt.Println(val) // 输出: Alice
}
// 删除
m.Delete("name")
// 加载或存储(如果不存在则设置)
m.LoadOrStore("age", 25)
注意:sync.Map不支持遍历操作的原子性,若需遍历所有元素,应配合回调函数使用Range方法:
m.Range(func(key, value interface{}) bool {
fmt.Printf("Key: %v, Value: %v\n", key, value)
return true // 继续遍历
})
根据实际使用场景选择不同的实现方式:
sync.RWMutex + map
sync.Map
要复杂操作如批量删除、排序等:自定义结构更可控避免误用sync.Map作为通用替代品。它的内部机制包含两层map(read-only和dirty),在频繁写入同一key时可能带来额外开销。
基本上就这些。关键在于理解每种方式的适用边界,结合业务特点做出合理选择。并发安全不只是加锁,更是对访问模式的设计考量。
以上就是如何用Golang实现并发安全的map操作_Golang 并发安全map实践的详细内容,更多请关注其它相关文章!
相关文章:
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
msn官网入口地址手机版 msn官方网站手机最新链接
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
快手极速版在线观看 官方网页版登录地址
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
Flexbox布局实践:实现粘性导航栏与底部固定页脚
红果短剧网页版官网入口 官方最新网址发布
mcjs网页版在线存档 mcjs云存档登录入口
深入理解与实现最大堆的Heapify过程:常见错误与修正
4399免费游戏网址入口 4399小游戏免费入口点开即玩
Python类型检查:优化关联可选属性的Mypy推断策略
Win10双系统截图高效法 截屏快捷键速记【技巧】
解决深度学习模型训练初期异常高损失与完美验证准确率问题
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
MongoDB聚合管道:正确匹配对象数组中_id的方法
实现分段式页面滚动导航:CSS与J*aScript教程
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
解决Bootstrap卡片顶部边距导致背景图下移的问题
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
将JSON对象数组转置为键值对列表的实用指南
Steam官网入口直达 Steam注册及登录步骤
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
抖音创作助手登录入口_抖音创作辅助工具官网直达
单射、满射与双射的关系 一文理清所有逻辑
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
Mac终端命令大全_Mac常用Terminal指令速查
Go语言HTML解析:利用Goquery精准获取指定元素内容
Go语言中Map值调用指针接收器方法的限制与应对
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议
机器学习中对数变换预测结果的反向还原
反效果?《战地6》免费试玩开启后玩家数不升反降
AO3官方可用镜像 Archive of Our Own网页版最新入口
绝地鸭卫平a核爆刀流玩法攻略
大麦的“候补”是什么意思 大麦候补购票规则【详解】