链表中的非阻塞同步与锁机制探讨
1. 延迟同步及其优缺点
延迟同步(Lazy Synchronization)具有一定的优势。它能够将诸如设置标志这类不太影响整体结构的逻辑步骤,与断开节点这类会对结构产生较大影响的物理操作分离开来。在简单的例子中,每次只断开一个节点。通常情况下,延迟操作可以批量处理,并在合适的时间进行,从而降低对结构进行物理修改时的整体干扰性。
然而,延迟同步也存在明显的缺点。LazyList 算法中的 add() 和 remove() 方法是阻塞的。也就是说,如果一个线程的操作被延迟,其他线程的操作也可能会受到影响。
2. 非阻塞同步的需求与挑战
有时,在将节点从链表中物理移除之前,先将其标记为逻辑移除是个不错的方法。接下来,我们要探讨如何进一步扩展这个思路,以实现完全无锁的操作,让 add()、remove() 和 contains() 这三个方法都能实现非阻塞。其中,前两个方法是无锁的(lock-free),而 contains() 方法是无等待的(wait-free)。
一个简单的想法是使用 compareAndSet() 方法来修改节点的 next 字段,但这种方法并不总是可行。例如,在图 9.22 中,当线程 A 尝试移除节点 a,而线程 B 尝试添加节点 b 时,如果 A 对 head.next 应用 compareAndSet(),B 对 a.next 应用 compareAndSet(),最终结果可能是 a 被正确删除,但 b 却无法添加到列表中。
3. AtomicMarkableReference 的引入
为了解决上述问题,我们引入了 AtomicMar
超级会员免费看
订阅专栏 解锁全文
32

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



