Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go中普通map和sync.map

go中普通map和sync.map的区别小结

作者:{⌐■_■}

本文主要介绍了go中普通map和sync.map的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 普通map的特点

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

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

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 读取失败的次数
}

核心机制:

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

3. 举个对比例子

// 普通 map + 锁
var m = make(map[string]int)
var mu sync.RWMutex

func 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 相比:

4. 面试回答

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

到此这篇关于go中普通map和sync.map的区别小结的文章就介绍到这了,更多相关go中普通map和sync.map内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文