golang中线程安全的两种数据结构:
channel
sync.Map
保证线程安全可以使用sync包下面的
互斥锁sync.Mutex
读写锁sync.RWMutex
原子操作sync.atomic
map的底层原理
count:key的数量
flags:是否进行写操作
B:桶的数量,它是以2为底的对数,即2的B次方
hash0:哈希因子
buckets:桶的列表,一个bmap数组存储键值对(当一个桶存不下时,会指向一个溢出桶存储,当这个溢出桶存不下时,会指向下一个溢出桶存储)
bmap里面包括tophash(高8位)、keys(键)(哈希运算+取模运算得到位置)、elems(值)、overflow(溢出桶)
map不可寻址
map的扩容
等量扩容:当有大量的key被删除时,为了提高查找效率,过滤掉无用的溢出桶,就会触发等量扩容
双倍扩容:底层是hashmap,当桶的数量大于等于6.5个时,或者,溢出桶的数量过多时,就会触发双倍扩容
map无序性
由于扩容机制,取模运算时桶的数量变化,key的位置不确定
标签:扩容,map,sync,golang,key,中线,溢出 From: https://www.cnblogs.com/kezhang2gopher/p/18624130