22、链表锁机制:从阻塞到非阻塞的演变

链表锁机制:从阻塞到非阻塞的演变

1. 延迟同步的特点

延迟同步有其独特的优势,它能够将设置标志这类不太影响整体的逻辑操作,与断开节点这类对结构有较大影响的物理操作分离开来。在简单的例子中,我们一次只断开一个节点,但实际上,延迟操作可以批量进行,并且在合适的时间进行处理,这样能减少对结构物理修改的整体影响。

不过,延迟列表(LazyList)算法也存在明显的缺点,其 add() remove() 方法是阻塞的。也就是说,如果一个线程操作延迟,其他线程可能也会受到影响。

2. 非阻塞同步的引入

有时候,在从列表中物理移除节点之前,先将其标记为逻辑移除是个不错的做法。我们可以进一步扩展这个思路,完全消除锁的使用,让 add() remove() contains() 这三个方法都实现非阻塞。其中,前两个方法是无锁的,最后一个方法是无等待的。

但简单地使用 compareAndSet() 来改变 next 字段是不可行的。例如,当线程A尝试移除节点a,而线程B尝试添加节点b时,可能会出现a被正确删除,但b未被添加到列表中的情况。同样,当两个线程尝试同时移除相邻节点时,也可能导致某个节点未被正确移除。

为了解决这些问题,我们需要确保节点从列表中逻辑或物理移除后,其字段不能被更新。我们的做法是将节点的 next marked 字段视为一个原子单元

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值