无锁链表算法:从延迟同步到无阻塞同步
在并发编程中,链表的同步机制是一个重要的研究领域。我们先从延迟同步(Lazy Synchronization)的概念入手,逐步深入探讨无阻塞同步(Non - Blocking Synchronization)的实现。
延迟同步的特点
延迟同步的一个好处是可以将一些不影响结构的逻辑操作(如设置标志)与对结构有较大影响的物理操作(如断开节点连接)分开。例如,在链表操作中,我们可以一次断开一个节点。通常,延迟操作可以批量处理,并在合适的时间进行,这样可以减少对结构物理修改的整体影响。
不过,延迟链表(LazyList)算法也有其缺点,其 add() 和 remove() 方法是阻塞的。也就是说,如果一个线程被延迟,其他线程可能也会受到影响。
无阻塞同步的需求与挑战
我们知道,在从链表中物理移除节点之前,先将节点标记为逻辑移除是一个不错的做法。现在,我们要进一步扩展这个想法,以实现完全无锁的链表,让 add() 、 remove() 和 contains() 这三个方法都能实现无阻塞操作(前两个方法是无锁的,最后一个是无等待的)。
一个简单的想法是使用 compareAndSet() 方法来修改 next 字段,但这种方法并不总是可行。例如,当线程A尝试移除节点a,而线程B尝试添加节点b时,可能会出现节点a被正确删除,但节点b未能添加到链表中的情况。同样,当两个线程同时尝试移除相邻
超级会员免费看
订阅专栏 解锁全文
1014

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



