首页 > 其他分享 >golang sync.Map 与使用普通的 map 的区别

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

时间:2024-06-12 21:10:22浏览次数:12  
标签:Map map goroutine sync 并发 普通

 


使用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

标签:Map,map,goroutine,sync,并发,普通
From: https://www.cnblogs.com/farwish/p/18242860

相关文章

  • 【K8s】专题五(1):Kubernetes 配置之 ConfigMap
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、主要特性三、资源清单(示例)四、常用操作一、基本介绍在Kubernetes中,ConfigMap是一种用于存储非敏感信息的资源对象,提供了向Pod......
  • mybatis的mapper中的sql涉及嵌套且外部引用导致的问题:XML fragments parsed from prev
    假设xxx.xml中有类似下方的sql嵌套:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xx......
  • mybatis-plus加载多个module的mapper踩坑记录
    背景 有一个多模块的项目,每个模块中都有自己的mapper.xml文件。但是在执行一次SQL查询中,mybatis却报出了下面的异常 排查过程第一步,先检查mapper扫描是否正确 先找到这个方法的位置 可以看到包名是com.pinming.security.responsibility.mapper 检查SpringBoot......
  • YOLO 模型的评估指标——IOU、Precision、Recall、F1-score、AP、mAP、
    一、置信度是什么?置信度用于评估模型对检测结果的信心程度下图中,绿色框A表示GroundTruth,也称GT,GT就是正确的标注(人工)二、IOU与TP、FP、FNiou:表示预测的边界框(或分割区域)与真实边界框(或分割区域)之间的交集与并集之间的比值。阈值:根据实际情况可调节IOU=0.5如果预......
  • syncthing 简易教程
    syncthing的作用:多平台文件同步客户端:win、安卓、Linux(docker)环境:手机、linux服务器、pclinux的ip地址为:123.123.123.123目的:做笔记,受不了remotely-save丢失的风险。仅让这几台设备互联,实现文件同步,不希望被其他设备发现。linuxweb界面设置:设置用户名和密码,并把下......
  • java面试题: HashMap、HashSet 和 HashTable 的区别
     HashMap常用方法 HashMap是一个基于哈希表的Map接口的实现。它允许使用null值和null键。 java复制//创建一个HashMapHashMap<KeyType,ValueType>map=newHashMap<>(); //添加元素map.put(key,value); //获取元素ValueTypevalue=map.get......
  • Go - The map[string]interface{} map
    Rememberthatthebiggestadvantageyougetfromusingamap[string]interface{}map,or anymapthatstoresaninterface{}valueingeneral,isthatyoustillhaveyourdatainitsoriginal stateanddatatype.Nowadays,webservicesworkbyexchangingJS......
  • c#中的异步操作 task与async/await
    TaskTask类表示一个异步操作。这个操作可以通过Task.Run方法、TaskFactory.StartNew方法,或直接通过newTask和Task.Start来启动。拿Task.Run举例Tasktask=Task.Run(()=>{//执行一些长时间运行的操作});Task.Run()是一个用来执行异步操作的方法。它启动......
  • 理解dispatch_async
    Submitsablockforasynchronousexecutiononadispatchqueueandreturnsimmediately.提交一个块以在调度队列上异步执行并立即返回。codeshowing以一个最简单的demo开始//创建一个同步队列dispatch_queue_tsyncQueue=dispatch_queue_create("io.sqi.My......
  • 巧妙使用mapstruct来解决数据库entiy到实体dto的映射关系
    1.引入mapstruct<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-p......