Wednesday, November 17, 2010

Lock-Free Concurrent Stack

package self.concurrent;

import java.util.concurrent.atomic.AtomicReference;

public class Stack {

   AtomicReference> atomicHead;
  
   public Stack()
   {
      atomicHead = new AtomicReference>();
   }
  
   public void push(T item)
   {
      Node currentHead = null;
      Node newHead = null;
      do
      {
         currentHead = atomicHead.get();
         newHead = new Node(item, currentHead);
      }
      while(!atomicHead.compareAndSet(currentHead, newHead));    
   }
  
   public T pop()
   {
      Node currentHead = null;
      Node newHead = null;
      do
      {
         currentHead = atomicHead.get();
         if (currentHead == null) return null;
         newHead = currentHead.next;
      }
      while(!atomicHead.compareAndSet(currentHead, newHead));
    
      return currentHead.item;
   }
}

No comments: