非阻塞同步算法

Treiber 1986

栈顶为一序列

public class ConcurrentStack<E> {
	AtomicReference<Node<E>> top = new AtomicReference<Node<E>>();
	
	public void push(E item){
		Node<E> newHead = new Node<E>(item);
		Node<E> oldHead = null;
		do{
			oldHead = top.get();
			newHead.next = oldHead;
		}while(!top.compareAndSet(oldHead, newHead));
	}
	
	public E pop(){
		Node<E> newHead = null;
		Node<E> oldHead = null;
		do{
			oldHead = top.get();
			if(oldHead == null){
				return null;
			}
			newHead = oldHead.next;
		}while(!top.compareAndSet(oldHead, newHead));
		return oldHead.item;
	}
	
	private static class Node<E>{
		public final E item;
		public Node<E> next;
		public Node(E item){
			this.item = item;
		}
	}
}

Michael Scott 1996

队尾和尾部节点两个序列


public class ConcurrentLink<E> {

	private final Node<E> dummy = new Node<E>(null, null);

	private final AtomicReference<Node<E>> head = 
		new AtomicReference<Node<E>>(dummy);
	private final AtomicReference<Node<E>> tail = 
		new AtomicReference<Node<E>>(dummy);
	
	public boolean push(E item){
		Node<E> newNode = new Node<E>(item, null);
		while(true){
			Node<E> curTail = tail.get();
			Node<E> tailNext = curTail.next.get();
			if(curTail == tail.get()){
				if(tailNext != null){
					tail.compareAndSet(curTail, tailNext);
				}else{
					if(curTail.next.compareAndSet(null, newNode)){
						tail.compareAndSet(curTail, newNode);
						return true;
					}
				}
			}
		}
	}
	
	private static class Node<E>{
		final E item;
		final AtomicReference<Node<E>> next;
		
		public Node(E item, Node<E> next){
			this.item = item;
			this.next = new AtomicReference<Node<E>>(next);
		}
	}
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值