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 ...
随机推荐
- 面向云时代的龙蜥操作系统,是 CentOS 替代的最佳选择
简介: 龙蜥致力于打造"芯""系"同频.云化创新.多快好省.安稳易用的操作系统产品! 2022 开放原子全球开源峰会 OpenAnolis 分论坛上,阿里云智能 ...
- [GPT] 机器学习框架平台或框架的学习成本和友好程度排名?
按照学习成本从高到低的顺序,大概如下: TensorFlow:虽然TensorFlow功能强大,但学习曲线比较陡峭,需要掌握一些深度学习的基本概念和数学知识. PyTorch:PyTorch相对而 ...
- [Unreal] 虚拟现实理论与最佳实践
优秀的虚拟现实场景所需要具备的特点: 真实感.沉浸感.舒适性.流畅性. VR的这些特点上有其它媒体所不具备的优势,主要通过硬件来实现. VR 的沉浸感让用户置身于周围世界,也引发了一些独特的症状: 眼 ...
- [FAQ] 如何避免过度依赖百度, 甚至超越百度
查找信息,你不依赖百度,势必要依赖其它. 那么如何超越百度搜索,也必须要站在巨人的肩膀上. 搜索市场已有不少巨头,最简单的超越办法是:站在所有巨人的肩膀上. Other:搜索的超越 Link:http ...
- Git 工具下载慢问题 & 图像化界面工具
Git 命令行淘宝镜像:git-for-windows Mirror (taobao.org) Git 图形客户端:Download – TortoiseGit – Windows Shell Int ...
- 4.k8s-配置网络策略 NetworkPolicy
一.基本了解 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/基本了解: 1.网 ...
- 基于三菱Q系列cc-Link的立体仓库控制系统
系统说明: 方案选择: 工艺流程: 触摸屏设计: 程序设计:采用SFC进行编程,结构清晰,逻辑明了 本文章为学习记录,水平有限,望各路大佬们轻喷!!! 转载请注明出处!!!
- VMware之系统复制
目录 功能描述 复制centos7-1文件夹 载入复制的系统 设置配置 启动系统 修改网卡配置 刷新配置 测试上网 功能描述 复制已经安装好的centOs7.6 复制centos7-1文件夹 1.系统 ...
- Python——基本输入和输出
Python提供了基本的输入和输出功能,这些功能通常是通过内置的input()函数(用于输入)和print()函数(用于输出)来实现的.以下是这两个函数的详细描述和示例: 1. print() 函数( ...
- cesium教程2-加载显示地形地图
上面地形数据,是调用cesium官方的地图服务,需要先注册cesium账户,配置cesium的账户token才行 1.在线地形服务的示例代码如下 <!DOCTYPE html> <h ...