信息发布→ 登录 注册 退出

如何用Golang实现并发安全的map操作_Golang 并发安全map实践

发布时间:2025-12-16

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

如何用golang实现并发安全的map操作_golang 并发安全map实践

在Go语言中,原生的map并不是并发安全的。多个goroutine同时读写同一个map会触发Go的竞态检测机制,导致程序崩溃或数据异常。要实现并发安全的map操作,必须引入同步机制或使用标准库提供的并发安全结构。

使用 sync.RWMutex 保护 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语言免费学习笔记(深入)”;

使用 sync.Map 实现高效并发map

Go 1.9 引入了sync.Map,专为高并发读写设计。它适用于以下场景:

Inworld.ai Inworld.ai

InWorldAI是一个AI角色开发平台,开发者可以创建具有自然语言、上下文意识和多模态的AI角色,并可以继承到游戏和实时媒体中

Inworld.ai 178 查看详情 Inworld.ai
  • 一个key被写一次,读多次
  • 多个goroutine各自读写不相交的key集合

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 // 继续遍历
})

选择合适的并发map方案

根据实际使用场景选择不同的实现方式:

  • 频繁更新少量key且读写混合:推荐使用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核爆刀流玩法攻略  大麦的“候补”是什么意思 大麦候补购票规则【详解】 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!