2013-10-24 6 views
0

Может кто-нибудь помочь мне в письменной форме неблокирующий, блокировкаstack реализация. Это в реализации Java Java?неблокирующий стек в java

Я пытался написать Потокобезопасную Stack, поставив глобальную блокировку на всей структуру стеки данных (это дорого), но, кажется, что можно написать без блокировки, блокировка свободного стека.

Алгоритм называется неблокирующим, если он заблокирован и не застрахован от тупика.

+0

С объектом, на него возлагается ответственность. В то время как пользователи на SO всегда готовы помочь, немного google и анализ результатов (ов) является обязательным. –

+1

, пожалуйста, откройте вопрос, я перефразировал вопрос. Благодарю. –

ответ

4
public class MyConcurrentStack<T> { 

    private AtomicReference<Node> head = new AtomicReference<Node>(); 

    public MyConcurrentStack() { 
    } 

    public void push(T t) { 
     if (t == null) { 
      return; 
     } 
     Node<T> n = new Node<T>(t); 
     Node<T> current; 

     do { 
      current = head.get(); 
      n.setNext(current); 
     } while (!head.compareAndSet(current, n)); 
    } 

    public T pop() { 
     Node<T> currentHead = null; 
     Node<T> futureHead = null; 
     do { 
      currentHead = head.get(); 
      if (currentHead == null) { 
       return null; 
      } 
      futureHead = currentHead.next; 
     } while (!head.compareAndSet(currentHead, futureHead)); 

     return currentHead.data; 
    } 

    /** 
    * 
    * @return null if no element present else return a element. it does not 
    * remove the element from the stack. 
    */ 
    public T peek() { 
     Node<T> n = head.get(); 
     if (n == null) { 
      return null; 
     } else { 
      return n.data; 
     } 
    } 

    public boolean isEmpty() { 
     if (head.get() == null) { 
      return true; 
     } 
     return false; 
    } 

    private static class Node<T> { 

     private final T data; 
     private Node<T> next; 

     private Node(T data) { 
      this.data = data; 
     } 

     private void setNext(Node next) { 
      this.next = next; 
     } 
    } 
} 
4

одновременно стек Java первого Google результата

очередей

java.util.concurrent ConcurrentLinkedQueue класса обеспечивает эффективную масштабируемую поточно-неблокируемую очередь FIFO . Пять реализации в java.util.concurrent поддерживают расширенную BlockingQueue интерфейс, который определяет блокирование версии ставить и принять: LinkedBlockingQueue, ArrayBlockingQueue, SynchronousQueue, PriorityBlockingQueue и DelayQueue. Различные классы охватывают наиболее распространенные контексты для производителей-потребителей, обмена сообщениями, параллельной задачи и . Интерфейс BlockingDeque расширяет BlockingQueue для поддержки как операций FIFO, так и LIFO (на основе стека). Класс LinkedBlockingDeque обеспечивает реализацию.

+3

ОП спрашивает о стеке, то есть LIFO. – Trying

+0

read again 'Интерфейс BlockingDeque расширяет BlockingQueue для поддержки как операций FIFO, так и LIFO (на основе стека). Класс LinkedBlockingDeque обеспечивает реализацию. ' – RamonBoza

+1

' LinkedBlockingDeque' не является реализацией, которую я хочу. я хочу, чтобы не блокировать и блокировать реализацию, которая 'LinkedBlockingDeque' не является. @Trying дает самый близкий ответ, но я все еще жду, если что-то еще возможно. Благодарю. –