Map 是一个非常常用的数据结构,一个无序的 key/value 对的集合,其中 Map 所有的 key 都是不同的,然后通过给定的 key 可以在常数时间 O(1) 复杂度内查找、更新或删除对应的 value。
就我所理解map其实就是一个数组+链表的组合,对于给定的 key,首选对key进行hash,然后相对哈希表的长度取模,将 key 映射到指定的地方。所以很明显,go中的map不是并发安全的。
在go新版本中,已经有了并发安全的map,据我所知其实现原理是通过原子性操作,来保证并发安全的,除了通过原子性操作以外,还有一直比较经典的实现并发安全map的方法,那就是分段锁。
分段锁的原理,是通过将该map分成n段,在不同的段之间加锁,当程序同时访问不同段的数据时,是安全的,如果同时访问一个段的数据,则因为锁的缘故,按顺序访问。并且通过定义一个分散器,让所有数据均匀分布,避免数据过于集中。