并发栈与消除机制详解
1. 引言
栈(Stack )是一种后进先出(LIFO)的数据结构,提供了 push() 和 pop() 方法。从表面上看,栈似乎不太适合并发操作,因为 push() 和 pop() 操作似乎需要在栈顶进行同步。然而,栈并非天生就是顺序执行的,我们可以实现高度并行的并发栈。首先,我们来探讨如何构建一个无锁栈,其中 push() 和 pop() 操作在单个位置进行同步。
2. 无界无锁栈
无锁栈是一个链表,其中 top 字段指向第一个节点(如果栈为空则为 null)。为了简单起见,通常假设向栈中添加 null 值是非法的。
- push() 方法 :创建一个新节点,然后调用 tryPush() 方法尝试将 top 引用从当前栈顶切换到新节点。如果 tryPush() 成功,push() 方法返回;否则,在退避后重复尝试。
- pop() 方法 :调用 tryPop() 方法,该方法使用 compareAndSet() 尝试从栈中移除第一个节点。如果成功,返回该节点;否则返回 null(如果栈为空则抛出异常)。tryPop() 方法会一直被调用,直到成功,此时 pop() 方法返回被移除节点的值。
以下是相关代码实现:
public class LockFreeStack<T> {
AtomicReference<Node> top = new AtomicReference<Node>(nu
超级会员免费看
订阅专栏 解锁全文

3115

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



