sync.Map的几个优化点

sync.Map的几个优化点

Content #

那 sync.Map 是怎么实现的呢?它是如何解决并发问题提升性能的呢?其实 sync.Map 的实现有几个优化点,这里先列出来,我们后面慢慢分析。

  1. 空间换时间。通过冗余的两个数据结构(只读的 read 字段、可写的 dirty),来减少加锁对性能的影响。对只读字段(read)的操作不需要加锁。

  2. 优先从 read 字段读取、更新、删除,因为对 read 字段的读取不需要锁。

  3. 动态调整。miss 次数多了之后,将 dirty 数据提升为 read,避免总是从 dirty 中加锁读取。

  4. double-checking。加锁之后先还要再检查 read 字段,确定真的不存在才操作 dirty 字段。

  5. 延迟删除。删除一个键值只是打标记,只有在提升 dirty 字段为 read 字段的时候才清理删除的数据。

Viewpoints #

From #

09 | map:如何实现线程安全的map类型?