无锁哈希集与开放寻址哈希集的实现与分析
1. 无锁哈希集概述
在哈希集的实现中,为了避免在调整表大小时“停止世界”(stop-the-world)的操作,我们需要将哈希集的实现改为无锁(lock-free)的,并且采用增量式调整大小的方式。这意味着每次调用 add() 方法时,只执行与调整大小相关工作的一小部分。这样, contains() 、 add() 和 remove() 方法的预期时间复杂度都为常数。
要实现可调整大小的无锁哈希,仅使各个桶无锁是不够的,因为调整表大小时需要原子地将条目从旧桶移动到新桶。如果表容量翻倍,我们必须将旧桶中的项拆分到两个新桶中。如果这个移动操作不是原子的,条目可能会暂时丢失或重复。
2. 递归拆分排序算法
2.1 算法核心思想
传统的哈希结构是在桶之间移动项,而这里的算法是在项之间移动桶。具体来说,将所有项保存在一个无锁的单链表中,类似于之前研究过的 LockFreeList 类。桶只是链表中的一个引用。随着链表的增长,我们引入额外的桶引用,以确保任何对象都不会离桶的起始位置太远。
2.2 数据结构组成
无锁哈希集的实现由两部分组成:一个无锁链表和一个不断扩展的引用数组,这些引用指向链表。这些引用就是逻辑桶。哈希集中的任何项都可以从链表头开始遍历链表找到,而桶引用则提供了链表的捷径,以最小化搜索时遍历的链表节点数。
2.3 桶的初始化与项的分配
哈希集的容量
无锁与布谷鸟哈希集实现、对比及优化
超级会员免费看
订阅专栏 解锁全文
291

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



