使用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 的区别的更多相关文章

  1. [转] golang中struct、json、map互相转化

    一.Json和struct互换 (1)Json转struct例子: type People struct { Name string `json:"name_title"` Age ...

  2. Map java中的map 如何修改Map中的对应元素

    Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.         Map的接口         Map ...

  3. Golang sync

    Go1.9.2 sync库里包含下面几类:Mutex/RWMutex/Cond/WaitGroup/Once/Map/Pool 1.Mutex:互斥锁,等同于linux下的pthread_mutex_ ...

  4. JAVA中对List<map<String,Object>>根据map某个key值进行排序

    方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...

  5. Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、

    特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣)                       ...

  6. 另一种遍历Map的方式: Map.Entry 和 Map.entrySet()

    源网址: http://blog.csdn.net/mageshuai/article/details/3523116 今天看Think in java 的GUI这一章的时候,里面的TextArea这 ...

  7. 关于jsp利用EL和struts2标签来遍历ValueStack的东东 ------> List<Map<K,V>> 以及 Map<K,<List<xxx>>> 的结构遍历

    //第一种结构Map<K,<List<xxx>>> <body> <% //显示map<String,List<Object>& ...

  8. Map.putAll方法——追加另一个Map对象到当前Map集合(转)

    该方法用来追加另一个Map对象到当前Map集合对象,它会把另一个Map集合对象中的所有内容添加到当前Map集合对象. 语法  putAll(Map<? extends K,? extends V ...

  9. Map获取键值,Map的几种遍历方法

    Map 类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集.接着,Map.Entry类提供了一个 getKey()方法和一个getValue()方法,Map ...

  10. 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 ...

随机推荐

  1. 基于信通院 Serverless 工具链模型的实践:Serverless Devs

    简介: Serverless Devs 作为开源开放的开发者工具,参编中国信通院<基于无服务器架构的工具链能力要求>标准,为行业统一规范发挥助推作用!​ 作者 | 江昱(阿里云 Serve ...

  2. 最佳实践|从Producer 到 Consumer,如何有效监控 Kafka

    简介: 对于运维人而言,如何安装维护一套监控系统,或如何进行技术选型,从来不是工作重点.如何借助工具对所需的应用.组件进行监控,发现并解决问题才是重中之重.随着 Prometheus 逐渐成为云原生时 ...

  3. Flink 助力美团数仓增量生产

    简介: 本文由美团研究员.实时计算负责人鞠大升分享,主要介绍 Flink 助力美团数仓增量生产的应用实践.内容包括:1.数仓增量生产:2.流式数据集成:3.流式数据处理:4.流式 OLAP 应用:5. ...

  4. 在 UOS 统信运行 dotnet 程序提示没有通过系统安全验证无法运行

    本文记录 dotnet 应用程序在 UOS 统信系统上运行时,提示 没有通过系统安全验证,无法运行 的问题 这个问题是因为没有开启 UOS 统信的开发者模式,直接将自己构建完成的包放上去跑导致的问题 ...

  5. mosquitto移植到ARM

      了解mosquitto的小伙伴多数都是想在arm中进行开发,所以将mosquitto移植到ARM板上就尤为重要了,当然也有在x86中进行应用开发的,想了解linux中安装mosquitto可以看我 ...

  6. Jetpack Compose(6)——动画

    目录 一.低级别动画 API 1.1 animate*AsState 1.2 Animatable 1.3 Transition 动画 1.3.1 updateTransition 1.3.2 cre ...

  7. ABAP RSA 加密

    最近出现一些SAP ABAP RSA加密的需求,这里搬运一篇文章,用于学习参考. 本文链接:https://www.cnblogs.com/hhelibeb/p/14952732.html 原文标题: ...

  8. pde复习笔记 第一章 波动方程 第三节 分离变量法

    教材 谷超豪<数学物理方程>第四版,虽然我们老师用的第三版,但是除了页码对不上,习题多了一点,也似乎没有多少区别. 打算开个新栏专门总结一下pde的各种计算问题,在图书馆算的手麻了,但是习 ...

  9. 预见预判_AIRIOT智慧交通管理解决方案

    随着机动车保有量的逐步增加,城市交通压力日益增大.同时,新能源车辆的快速发展虽然带来了环保效益,但也因不限号政策而进一步加剧了道路拥堵问题.此外,各类赛事和重大活动的交通管制措施也时常导致交通状况复杂 ...

  10. 智能便捷_AIRIOT智慧充电桩管理解决方案

    现如今随着对可持续交通的需求不断增加,电动车市场正在迅速扩大,建设更多更智能的充电桩,并通过管理平台提高充电设施的可用性和效率成为一项重要任务.传统的充电桩管理平台在对充电设施进行管理过程中,存在如下 ...