欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Go 并发安全:Sync.Map 底层 Read/Dirty 双字典无锁设计

发表于:|最后更新:|分类:后端开发|阅读:2255 次

为了解决标准 map 配合读写锁 sync.RWMutex 在高并发读多写少场景下的锁竞争瓶颈,Go 标准库引入了 sync.Map。其核心机制依赖两张表:只读且无需加锁的 read 字典,以及持有互斥锁的 dirty 字典。

一、readOnly 结构定义与原子加载

go
type readOnly struct {
    m       map[any]*entry
    amended bool // 若 dirty 包含 read 中缺失的 key,则为 true
}

type entry struct {
    // p == nil 表示已被删除;p == expunged 表示已转移至 dirty 阶段
    p unsafe.Pointer 
}