当前位置: 首页 > news >正文

【go】普通map和sync.map的区别,源码解析

1. 普通 map 的特点

Go 内置的 map非并发安全的:

  • 单协程里读写没问题;
  • 多协程同时写会触发 fatal error: concurrent map writes
  • 多协程并发读写需要自己加锁(如 sync.RWMutex)。

源码层面(runtime/map.go):

  • map 内部通过 hmap 结构体存储桶(buckets)管理数据;
  • 设计目标是高性能单线程
  • 并没有加锁逻辑。

2. sync.Map 的特点

Go 在 1.9+ 引入了 sync.Map,为高并发场景做了专门优化。
特点:

  • 并发安全,内部已经封装了锁;
  • 针对读多写少的场景做了特别优化(类似“读写分离”)。

源码层面(sync/map.go):

type Map struct {mu Mutex               // 写操作用的锁read atomic.Value      // 存储只读部分,原子读dirty map[any]*entry   // 可写部分,写时更新misses int             // 记录从 read 读取失败的次数
}

核心机制:

  • 双 map 设计

    • read(只读,atomic.Value):无锁读,性能高;
    • dirty(写缓冲,受锁保护):存储新增/修改的数据;
  • 写时迁移策略:当 read 中 miss 次数过多,会把 dirty 提升为 read

  • 保证读快写慢的同时,整体高并发安全。

通过readdirty分别存储读写状态,以空间换时间的策略,去减少锁冲突。


3. 举个对比例子

// 普通 map + 锁
var m = make(map[string]int)
var mu sync.RWMutexfunc safeWrite(k string, v int) {mu.Lock()defer mu.Unlock()m[k] = v
}func safeRead(k string) (int, bool) {mu.RLock()defer mu.RUnlock()v, ok := m[k]return v, ok
}

sync.Map 相比:

  • 普通 map+RWMutex写性能更好,适合频繁写
  • sync.Map读性能更好,适合读多写少

4. 面试回答

普通 map 是非并发安全的,需要开发者手动用 sync.RWMutex 保证线程安全。
sync.Map 内部采用 读写分离(read + dirty) 的双 map 设计,读操作可以无锁原子读,写操作用锁保护,并在一定 miss 次数后把 dirty 提升为 read
适用场景不同:

  • sync.Map:读多写少,典型场景如缓存、配置表;
  • map+RWMutex:写多的场景更优。

http://www.dtcms.com/a/424543.html

相关文章:

  • wordpress多站点详细设置(图解)建个个人网站一年多少钱
  • Python bisect
  • Docker 安装与核心知识总结
  • 编辑网站化妆品网页设计素材
  • 做视频网站的技能可以自己制作广告的软件
  • Jupyter Notebook下载安装使用教程(附安装包,图文并茂)
  • 《算法与数据结构》第七章[算法2]:广度优先搜索(BFS)
  • Salesforce 知识点:Connected App
  • 通用系统资源监控命令(Linux)
  • 衡水网站建设知识企业站系统
  • 做房产网站用什么软件亚马逊雨林的资料
  • airsim多无人机+无人车联合仿真辅导
  • 深度学习:池化(Pooling)
  • 亚圣信息科技做网站怎么样社交网站 cms
  • ftp网站目录做旅行同业的网站
  • 9.3 堆排序(排序(上))
  • 怎么向企业推销网站建设外国网站域名
  • gradle task build 渠道包
  • 【Java】P9 面向对象编程完全指南(S1-2 基础篇 深入理解Java方法的四个重要概念)
  • 网站如何做移动适配网站的推广是怎么做的
  • almalinux MySQL8.0安装
  • python做网站建e全景效果图
  • 网站建设费可以抵扣么推广网上国网有什么好处
  • 【APK安全】WebView组件的安全风险与防御指南
  • 秦皇岛网站定制哪家好厦门市建设局网站咨询电话
  • 是阿里巴巴好还是自己做网站好?wordpress nginx配置伪静态
  • 夫妻工作室网站建设枣庄网站seo
  • 【Android】一个demo理解dispatchTouchEvent、onInterceptTouchEvent与onTouchEvent
  • 十大网站平台重写Wordpress的js
  • HBase全量+增量迁移import/export方式