golang sync.Map 与使用普通的 map 的区别

使用sync.Map与普通的Go map主要有以下几点区别:

  1. 并发安全性

普通map: 在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。

sync.Map: 是并发安全的。它内部实现了必要的同步机制,允许多个goroutine同时读写而不会引发数据竞争问题。

  1. 性能

普通map: 对于单线程或同步控制下的访问,性能通常优于sync.Map,因为它避免了额外的同步开销。

sync.Map: 由于其内部的读写锁和复杂的逻辑(如读写分离、延迟更新等),在并发访问下虽然保证了安全,但可能比直接操作普通map慢一些。不过,在高并发且读多写少的场景下,它的性能损失相对较小。

  1. 使用场景

普通map: 适用于单线程环境或在有明确同步控制(如使用Mutex手动加锁解锁)的多goroutine环境中。

sync.Map: 适用于无须显式锁控制的多goroutine共享数据场景,比如作为缓存、计数器等,特别是在读远多于写的场景下表现更佳。

  1. 示例对比
    https://github.com/farwish/go-lab/blob/master/src/sync/map.go

在选择使用map还是sync.Map时,需要根据具体的应用场景权衡并发需求与性能要求。

【问题】

m := new(sync.Map) 初始化后,能不使用 m.Store 而是 m["key"] = 1 写入?

答案是 不可以直接使用m["key"] = 1这种方式来写入sync.Map。

因为sync.Map并没有直接实现索引赋值操作,它不支持像普通map那样的直接通过索引操作来设置或获取键值对。

为了保证并发安全,sync.Map提供了特定的方法来进行读写操作,如Store, Load, LoadOrStore, Delete, 和 Range等。

如果你想类似地使用索引操作,你需要通过sync.Map提供的方法来间接实现。

Link:https://www.cnblogs.com/farwish/p/18242860

相关推荐
YGGP26 分钟前
【Golang】LeetCode 21. 合并两个有序链表
leetcode·链表·golang
看见繁华28 分钟前
GO 教程
开发语言·后端·golang
Yy_Yyyyy_zz31 分钟前
深入理解 Go 的多返回值:语法、编译原理与工程实践
开发语言·后端·golang
天远云服1 小时前
Fintech硬核架构:解析天远贷前风险报告接口在Go微服务中的解析策略
微服务·架构·golang
Grassto2 小时前
Go 在哪里找第三方包?Module 查找顺序详解
开发语言·后端·golang
nbsaas-boot11 小时前
Go 项目中如何正确升级第三方依赖(Go Modules 实战指南)
开发语言·后端·golang
HashFlag1 天前
单元测试(go)
golang·单元测试
TDengine (老段)1 天前
TDengine Go 连接器入门指南
大数据·数据库·物联网·golang·时序数据库·tdengine·涛思数据
YGGP1 天前
【Golang】LeetCode 206. 反转链表
leetcode·链表·golang
YGGP1 天前
【Golang】LeetCode 142. 环状链表 II
leetcode·链表·golang