31、无锁哈希集与开放寻址哈希集的实现与原理

无锁哈希集与开放寻址哈希集的实现与原理

1. 无锁哈希集概述

无锁哈希集的实现目标是让哈希集的操作无锁化,并且实现增量式的扩容。这意味着每次调用 add() 方法时,仅执行与扩容相关工作的一小部分,避免在扩容时“停止世界”。 contains() add() remove() 方法的期望时间复杂度均为常数。

要实现可扩容的无锁哈希,仅让单个桶无锁是不够的,因为扩容时需要原子性地将条目从旧桶移动到新桶。若表容量翻倍,旧桶中的项必须在两个新桶之间进行分割。若此移动不是原子性的,条目可能会暂时丢失或重复。在无锁的情况下,必须使用如 compareAndSet() 这样的原子方法进行同步,但这些方法仅能操作单个内存位置,这使得将节点从一个链表原子性地移动到另一个链表变得困难。

2. 递归分割排序

此哈希集的实现采用了一种独特的方式,即不移动桶中的项,而是移动项之间的桶。具体而言,将所有项保存在一个无锁链表中,桶只是链表中的引用。随着链表的增长,会引入更多的桶引用,以确保任何对象都不会离桶的起始位置太远。

哈希集的容量 N 始终是 2 的幂。桶数组初始容量为 2,除索引为 0 的桶引用一个空列表外,其他桶引用均为 null 。使用 bucketSize 变量表示桶结构的动态容量。桶数组中的每个条目在首次访问时初始化,随后引用链表中的一个节点。

当插入、删除或搜索哈希码为

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值