无锁哈希集与开放寻址哈希集的实现解析
1. 无锁哈希集概述
无锁哈希集的实现是为了让哈希集的操作更加高效,避免使用锁带来的性能开销。同时,它采用增量式的扩容方式,即每次 add() 方法调用只执行与扩容相关工作的一小部分,这样就无需在扩容时“停止世界”。 contains() 、 add() 和 remove() 方法的期望时间复杂度均为常数。
要实现可扩容的无锁哈希,仅让单个桶无锁是不够的,因为扩容时需要原子性地将条目从旧桶移动到新桶。如果移动操作不是原子性的,条目可能会暂时丢失或重复。在没有锁的情况下,需要使用原子方法(如 compareAndSet() )进行同步,但这些方法只能操作单个内存位置,这使得原子性地将节点从一个链表移动到另一个链表变得困难。
2. 递归分割排序
为了解决上述问题,采用了一种独特的哈希集实现方式,即颠倒传统哈希结构:不是在桶之间移动项,而是在项之间移动桶。
具体来说,将所有项保存在一个无锁链表中,类似于第 9 章研究的 LockFreeList 类。桶只是链表中的一个引用。随着链表的增长,会引入额外的桶引用,以确保任何对象都不会离桶的起始位置太远。这种算法确保一旦项被放入链表中,就不会再移动,但要求项按照递归分割排序算法插入。
哈希集的容量 N 始终是 2 的幂。桶数组初始容量为 2,除索引为 0 的桶引用一个空列表外,其他桶引用均为 null 。使
超级会员免费看
订阅专栏 解锁全文
904

被折叠的 条评论
为什么被折叠?



