Реализация неблокирующего стека на
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;
}
}
}
А слабо к этому стеку прикрутить блокирующую семантику, что бы pop() на пустом стеке блокировался до появления элемента, и так что бы стек оставался lock-free пока есть элементы?
ОтветитьУдалитьТ.е. блокирующую семантику как здесь:
ОтветитьУдалитьhttp://kharkovconcurrencygroup.blogspot.com/2009/09/2-boundedbuffer.html
Тут ответил http://kharkovconcurrencygroup.blogspot.com/2009/09/pop-lock-free.html
ОтветитьУдалитькурсовые по физике дипломные по физике история для всех история українські курсові українські реферати аэробика для всех аэробика сериальные обои обои к сериалам внешний тюнинг автозвук индия китай сказки в мире сказок настройка интернета сетевое оборудование seropol5
ОтветитьУдалить