题目来源:知乎
频次:1
答案:小小
Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。
而 sync.map 则是一种并发安全的 map,在 Go 1.9 引入。
sync.map 是线程安全的,读取,插入,删除也都保持着常数级的时间复杂度。
sync.map 的零值是有效的,并且零值是一个空的 map。在第一次使用之后,不允许被拷贝。
一般情况下解决并发读写 map 的思路是加一把大锁,或者把一个 map 分成若干个小 map,对 key 进行哈希,只操作相应的小 map。前者锁的粒度比较大,影响效率;后者实现起来比较复杂,容易出错。
而使用 sync.map 之后,对 map 的读写,不需要加锁。并且它通过空间换时间的方式,使用 read 和 dirty 两个 map 来进行读写分离,降低锁时间来提高效率。
这道面试题涉及了,sync.map 和 map 的知识点。在答完区别后,可以对这两个结构分别进行讲解。
本文来自投稿,不代表本站立场,如若转载,请注明出处: