当前位置: 首页 > article >正文

[Go]-sync.map使用详解

在这里插入图片描述

sync.Map是 Go 语言中在并发环境下使用的安全映射类型。

一、为什么需要sync.Map

在 Go 语言中,普通的map不是并发安全的。当多个 goroutine 同时读写一个普通map时,可能会导致程序出现未定义的行为,比如数据竞争、程序崩溃等。而sync.Map则专门设计用于在并发环境下安全地进行读写操作。

二、主要方法

Store(key, value interface{}):存储一个键值对。将指定的keyvalue存储到sync.Map中。如果key已经存在,则会更新对应的值。

var m sync.Map
m.Store("key1", "value1")

Load(key interface{}) (value interface{}, ok bool):读取一个键对应的值。根据给定的keysync.Map中获取对应的值,如果key存在,则返回对应的值和true;如果key不存在,则返回nilfalse

value, ok := m.Load("key1")
if ok {
    fmt.Println(value)
}

Delete(key interface{}):删除一个键值对。根据给定的keysync.Map中删除对应的键值对。

m.Delete("key1")

Range(f func(key, value interface{}) bool):遍历sync.Map中的所有键值对。遍历过程中会对每个键值对调用传入的函数f,如果f返回false,则遍历停止。

m.Range(func(key, value interface{}) bool {
    fmt.Println(key, value)
    return true
})

三、使用场景

  1. 高并发场景下的缓存:在多个 goroutine 同时读写缓存数据时,sync.Map可以保证数据的一致性。
  2. 读多写少的情况:如果数据主要是读取操作,且写操作较少,比如缓存和配置管理。sync.Map 使用了无锁的快速路径来优化读取操作,因此在读多写少的场景下性能较好。
  3. 临时存储或共享数据:适合用于存储一些需要跨 goroutine 共享的数据,特别是临时数据或频繁更新的全局数据。
  4. 需要频繁扩展 key 的场景:当有很多动态 key 时,sync.Map 是一个不错的选择,因为它在增加新的 key 时不需要重新扩容,能避免频繁内存分配。
  5. 简单的缓存场景:在多 goroutine 并发访问的情况下,如果需要维护一个简单的缓存,可以使用 sync.Map 来存储缓存数据。比如在 HTTP 服务中,用于保存用户会话、请求状态等数据。
  6. 资源标识符映射场景:当需要维护某些资源标识符(如 ID、连接句柄等)到结构体实例的映射时,使用 sync.Map 可以减少锁的开销。
  7. 需要安全的删除和遍历sync.Map 提供了并发安全的 DeleteRange 方法,适合在需要频繁删除、查找和遍历的场景下使用。
  8. 并发结构体属性管理:可以用于并发安全地管理结构体的某些属性,例如计数器、状态信息等需要跨多个 goroutine 操作的字段。

不过,sync.Map 并不适合所有并发场景。对于读写比例相对均衡,且需要进行大量写操作的情况,使用传统的 map 搭配 sync.RWMutex 通常会表现得更好。

四、注意事项

  1. sync.Map的性能可能不如普通map在单线程环境下的性能高。如果你的程序不是在高并发环境下,使用普通map并配合适当的同步机制可能更合适。
  2. sync.Map返回的value是一个interface{}类型,在使用时需要进行类型断言,以确保获取到正确类型的值。

http://www.kler.cn/a/396607.html

相关文章:

  • Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu
  • 基于Spring Boot的电子商务系统设计
  • [Python学习日记-67] 封装
  • 五、函数封装及调用、参数及返回值、作用域、匿名函数、立即执行函数
  • 计算机网络HTTP——针对实习面试
  • 【网络安全 | 甲方建设】双/多因素认证、TOTP原理及实现
  • AI助力智能运维!在Linux主机上实现和chatgpt对话
  • 九、HttpMessageConverter
  • css:权重计算
  • 在 Unix 和类 Unix 操作系统中,信号是一种异步的通知机制,用于通知进程发生了一些特定的事件。
  • 【C#】第6章:用户界面设计 课后习题
  • 【提高篇】3.4 GPIO(四,工作模式详解 下)
  • 企业知识中台:构建智慧企业的核心
  • 三、计算机视觉_01图像的基本操作
  • Android 国际化多语言标点符号的适配
  • 基于lighthouse搭建私有网盘Cloudreve【开源应用实践】
  • pySpark乱码
  • 【星闪EBM-H63开发板】AT固件的配置与测试
  • 【Java Web】JSON 以及 JSON 转换
  • JavaWeb笔记整理——Spring Task、WebSocket
  • 【摄像头识别动物行为通常涉及计算机视觉技术】
  • 基于Java+SpringBoot+Vue的智慧社区设计与实现
  • 用枚举算法解决LeetCode第3348题最小可整除数位乘积II
  • 代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结
  • 如何使用EasyExcel生成多列表组合填充的复杂Excel示例
  • Dockerfile构建镜像(练习一Apache镜像)(5-1)