golang sync.Map 与使用普通的 map 的区别
使用sync.Map与普通的Go map主要有以下几点区别:
1. 并发安全性
普通map: 在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。
sync.Map: 是并发安全的。它内部实现了必要的同步机制,允许多个goroutine同时读写而不会引发数据竞争问题。
2. 性能
普通map: 对于单线程或同步控制下的访问,性能通常优于sync.Map,因为它避免了额外的同步开销。
sync.Map: 由于其内部的读写锁和复杂的逻辑(如读写分离、延迟更新等),在并发访问下虽然保证了安全,但可能比直接操作普通map慢一些。不过,在高并发且读多写少的场景下,它的性能损失相对较小。
3. 使用场景
普通map: 适用于单线程环境或在有明确同步控制(如使用Mutex手动加锁解锁)的多goroutine环境中。
sync.Map: 适用于无须显式锁控制的多goroutine共享数据场景,比如作为缓存、计数器等,特别是在读远多于写的场景下表现更佳。
4. 示例对比
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
golang sync.Map 与使用普通的 map 的区别的更多相关文章
- [转] golang中struct、json、map互相转化
一.Json和struct互换 (1)Json转struct例子: type People struct { Name string `json:"name_title"` Age ...
- Map java中的map 如何修改Map中的对应元素
Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map ...
- Golang sync
Go1.9.2 sync库里包含下面几类:Mutex/RWMutex/Cond/WaitGroup/Once/Map/Pool 1.Mutex:互斥锁,等同于linux下的pthread_mutex_ ...
- JAVA中对List<map<String,Object>>根据map某个key值进行排序
方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- 另一种遍历Map的方式: Map.Entry 和 Map.entrySet()
源网址: http://blog.csdn.net/mageshuai/article/details/3523116 今天看Think in java 的GUI这一章的时候,里面的TextArea这 ...
- 关于jsp利用EL和struts2标签来遍历ValueStack的东东 ------> List<Map<K,V>> 以及 Map<K,<List<xxx>>> 的结构遍历
//第一种结构Map<K,<List<xxx>>> <body> <% //显示map<String,List<Object>& ...
- Map.putAll方法——追加另一个Map对象到当前Map集合(转)
该方法用来追加另一个Map对象到当前Map集合对象,它会把另一个Map集合对象中的所有内容添加到当前Map集合对象. 语法 putAll(Map<? extends K,? extends V ...
- Map获取键值,Map的几种遍历方法
Map 类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集.接着,Map.Entry类提供了一个 getKey()方法和一个getValue()方法,Map ...
- POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat 二分)
POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat ...
随机推荐
- DTCC 2020 | 阿里云赵殿奎:PolarDB的Oracle平滑迁移之路
简介: Oracle兼容性是业务客户从Oracle生态迁移到PolarDB生态的第一步也是至关重要的一步,PolarDB通过不断沉淀支持大量实际业务的真实Oracle兼容性功能,确保客户业务可以真正做 ...
- 基于 EventBridge 构建数据库应用集成
简介:本文重点介绍 EventBridge 的新特性:数据库 Sink 事件目标. 作者:赵海 引言 事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务,支持将阿里云服务.自定 ...
- OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践
简介: 随着云原生技术的逐步成熟,阿里云容器服务团队在具体落地实践过程中不断探索云原生技术的应用边界.同时随着物联网和 5G 的迅猛发展,传统的边缘计算架构已经不能满足业务发展的需要. 如何基于云原生 ...
- 一文说清linux system load
简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是 ...
- [Go] 选择 Beego 的三个理由
1. 项目支持角度较其它框架考虑的多一些,比如:目录结构的简单约定,内置项目配置读取,内置bee脚手架,热重载特性 等. (实际这些 feature 都可以找到 golang 专精的组件引入起来,效果 ...
- 迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台
我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则 ...
- Windows下绑定线程到指定的CPU核心
在某些场景下,需要把程序绑定到指定CPU核心提高执行效率.通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinity ...
- 五、Doris数据分布
在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述 名词解释 数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能 短查询:s ...
- Linux中的umask
在Linux中,当创建一个文件或者目录的时候,系统会自动为这个文件或者目录赋予默认的权限,而umask命令就是用来控制这个默认权限的. 查看umask umask的查看有两种方式,一种不带选项-S,一 ...
- WEB服务与NGINX(2)-NGINX的I/O模型
WEB服务与NGINX(2)-NGINX的I/O模型 目录 WEB服务与NGINX(2)-NGINX的I/O模型 1. linux I/0模型及在NGINX中的应用 1.1 I/O模型概述 1.2 系 ...