golang中sync.map的原理分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,小编给大家分享一下golang中sync.map的原理分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!读懂关系图需要了解
千家信息网最后更新 2025年12月02日golang中sync.map的原理分析
小编给大家分享一下golang中sync.map的原理分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

读懂关系图需要了解的几个关键点
var expunged = unsafe.Pointer(new(interface{}))
type Map struct
type readOnly struct
type entry struct
func (m *Map) Load(key interface{}) (value interface{}, ok bool)
func (m *Map) Store(key, value interface{})
func (m *Map) Delete(key interface{})
func (m *Map) Range(f func(key, value interface{}) bool)这里要重点关注readOnly.amended、Map.misses和entry.p的数值状态, 拓扑图中,多处用于走势判断.
接下来详细列出结构体的代码和注释, 方便阅读理解拓扑图.
sync.Map主要结构和注释
type Map struct {
//互斥锁,用于锁定dirty map
mu Mutex
//优先读map,支持原子操作,注释中有readOnly不是说read是只读,而是它的结构体。read实际上有写的操作
read atomic.Value
// dirty是一个当前最新的map,允许读写
dirty map[interface{}]*entry
// 主要记录read读取不到数据加锁读取read map以及dirty map的次数,当misses等于dirty的长度时,会将dirty复制到read
misses int
}
// readOnly 主要用于存储,通过原子操作存储在 Map.read 中元素。
type readOnly struct {
// read的map, 用于存储所有read数据
m map[interface{}]*entry
// 如果数据在dirty中但没有在read中,该值为true,作为修改标识
amended bool
}
// entry 为 Map.dirty 的具体map值
type entry struct {
// nil: 表示为被删除,调用Delete()可以将read map中的元素置为nil
// expunged: 也是表示被删除,但是该键只在read而没有在dirty中,这种情况出现在将read复制到dirty中,即复制的过程会先将nil标记为expunged,然后不将其复制到dirty
// 其他: 表示存着真正的数据
p unsafe.Pointer // *interface{}
}sync.Map的原理很简单,使用了空间换时间策略,通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响。
通过引入两个map将读写分离到不同的map,其中read map提供并发读和已存元素原子写,而dirty map则负责读写。
这样read map就可以在不加锁的情况下进行并发读取,当read map中没有读取到值时,再加锁进行后续读取,并累加未命中数。
当未命中数大于等于dirty map长度,将dirty map上升为read map。
从结构体的定义可以发现,虽然引入了两个map,但是底层数据存储的是指针,指向的是同一份值。
以上是"golang中sync.map的原理分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
数据
结构
存储
原理
两个
元素
原子
注释
篇文章
分析
内容
情况
拓扑
拓扑图
长度
不同
接下来
不怎么
代码
关键
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
嵌入式软件开发有写文档的习惯吗
搭接网络技术
浪潮服务器默认管理密码
网络安全自学需要多久
服务器管理器防火墙配置
如何查看服务器硬盘做的raid
er图设计数据库实训总结
育碧的服务器多少钱
软件开发自考资料
服务器ssh登录服务器
pod怎么连接数据库
ai软件开发技术招聘
数据库后面标记可疑怎么处理
找答案软件开发
如何查看数据库备份的路径
河北移动网络安全
修改底层数据库数据
怎么判断服务器的磁盘
软件开发文档谁写比较合适
乐顾网络技术 三所
dell 服务器光盘启动
大数据库思维方式是什么
oracle数据库创建表
预防电信诈骗维护网络安全黑板报
淘宝准点抢购软件开发
非常准软件开发商
华为出售x86服务器业务价格
北京梆梆网络安全
维斯一联打印服务器需要装软件吗
太仓中高端服务器厂家直销价格