使用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. 智能logo免费体验|网站Logo这样设计搜索排名跟着提升

    ​简介:一个好的网站logo,不仅让用户一眼知道网站品牌传递的信息,还能提高网站专业度和丰富度,增加SEO搜索排名.今天分享下如何设计一款实用的网站logo.阿里云智能logo设计,在线免费体验log ...

  2. 如何在零停机的情况下迁移 Kubernetes 集群

    ​简介:本文将通过集群迁移的需求.场景以及实践方式,介绍如何基于阿里云容器服务 ACK,在零停机的情况下迁移 Kubernetes 集群. 作者:顾静(子白)|阿里云高级研发工程师:谢瑶瑶(初扬)|阿 ...

  3. dotnet 读 WPF 源代码笔记 插入触摸设备的初始化获取设备信息

    在 WPF 触摸应用中,插入触摸设备,即可在应用里面使用上插入的触摸设备.在 WPF 使用触摸设备的触摸时,需要获取到触摸设备的信息,才能实现触摸 获取触摸设备插入 在 WPF 中,通过 Window ...

  4. computed计算属性和watch的区别:

    计算 ' 单价 x 数量 = 总价 ' watch:就不写了,没意思 computed: computed:{ allPrice:function(){ return this.price*this. ...

  5. 五、Doris数据分布

    在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述 名词解释 数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能 短查询:s ...

  6. ZJC比赛

    \(\large{Uptatete}\) 先放张图 这次是真的没想再改了,但是一到教室就又会怎么优化了 没必要每个点都让它和其他所有点判断一下,可以从上一个点加加减减啥的转过来 然后我就在昨天那个 \ ...

  7. 超轻量级的c#版基于文件的日志记录工具,可定制输出格式,可指定日志文件

    这是我自己个人编写的日志记录,主要使用在只需要记录日志,偶尔到文件中查看一下日志记录的情况.我自己写的一些服务之类的是使用了这个的,代码很少,使用很简单. 第一步 搜索和安装我的Nuget包 搜索和安 ...

  8. linux diff求两个文件的差集

    awk 从文本中过滤出需要的ip queryId_20231109214653_ipBatchQueryResult.json {"id":0,"ip":&qu ...

  9. Golang 版本 支付宝支付SDK app支付接口2.0

    参考技术贴: https://blog.csdn.net/ming2316780/article/details/86505883 对接文档: https://opendocs.alipay.com/ ...

  10. Splashtop 支持对 Adobe Creative Cloud 视频应用程序的远程访问

    快讯:Splashtop 为 Adobe Creative Cloud 视频和音频产品的用户提供了对其工作站的高性能远程访问,使他们能够在家中工作. 程访问和远程支持解决方案的领导者 Splashto ...