无锁哈希集与开放寻址哈希集的实现与原理
1. 无锁哈希集概述
无锁哈希集的实现目标是让哈希集的操作无锁化,并且实现增量式的扩容。这意味着每次调用 add() 方法时,仅执行与扩容相关工作的一小部分,避免在扩容时“停止世界”。 contains() 、 add() 和 remove() 方法的期望时间复杂度均为常数。
要实现可扩容的无锁哈希,仅让单个桶无锁是不够的,因为扩容时需要原子性地将条目从旧桶移动到新桶。若表容量翻倍,旧桶中的项必须在两个新桶之间进行分割。若此移动不是原子性的,条目可能会暂时丢失或重复。在无锁的情况下,必须使用如 compareAndSet() 这样的原子方法进行同步,但这些方法仅能操作单个内存位置,这使得将节点从一个链表原子性地移动到另一个链表变得困难。
2. 递归分割排序
此哈希集的实现采用了一种独特的方式,即不移动桶中的项,而是移动项之间的桶。具体而言,将所有项保存在一个无锁链表中,桶只是链表中的引用。随着链表的增长,会引入更多的桶引用,以确保任何对象都不会离桶的起始位置太远。
哈希集的容量 N 始终是 2 的幂。桶数组初始容量为 2,除索引为 0 的桶引用一个空列表外,其他桶引用均为 null 。使用 bucketSize 变量表示桶结构的动态容量。桶数组中的每个条目在首次访问时初始化,随后引用链表中的一个节点。
当插入、删除或搜索哈希码为
超级会员免费看
订阅专栏 解锁全文

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



