воскресенье, 27 сентября 2009 г.

лекция #2: NonBlockingStack

Реализация неблокирующего стека на java.util.concurrent.atomic.AtomicReference:
import java.util.concurrent.atomic.AtomicReference;
import java.util.EmptyStackException;

class NonBlockingStack {
private AtomicReference head = new AtomicReference(null);
public void push(int data) {
for (; ;) {
Node next = (Node) head.get();
Node myNode = new Node(data, next);
if (head.compareAndSet(next, myNode)) {
return;
}
}
}


   public int pop() {
for (;;) {
Node currHead = (Node) head.get();
if (currHead == null) {
throw new EmptyStackException();
}
if (head.compareAndSet(currHead, currHead.next)) {
return currHead.data;
}
}
}

private static class Node {
private final int data;
private final Node next;
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
}

4 комментария:

  1. А слабо к этому стеку прикрутить блокирующую семантику, что бы pop() на пустом стеке блокировался до появления элемента, и так что бы стек оставался lock-free пока есть элементы?

    ОтветитьУдалить
  2. Т.е. блокирующую семантику как здесь:
    http://kharkovconcurrencygroup.blogspot.com/2009/09/2-boundedbuffer.html

    ОтветитьУдалить
  3. Тут ответил http://kharkovconcurrencygroup.blogspot.com/2009/09/pop-lock-free.html

    ОтветитьУдалить
  4. курсовые по физике дипломные по физике история для всех история українські курсові українські реферати аэробика для всех аэробика сериальные обои обои к сериалам внешний тюнинг автозвук индия китай сказки в мире сказок настройка интернета сетевое оборудование seropol5

    ОтветитьУдалить