非阻塞并发队列提供和刷新
我需要一个基本上只有 2 个操作的无界非阻塞并发队列:
- offer : 原子地将指定的项目插入队列的尾部;
- flush :获取队列中当时存在的所有项目,并按照插入顺序开始一个接一个地处理它们。更具体地说,必须是原子的只是这个“takeAll”操作,它将是刷新的第一个操作。在 takeAll 之后提供给队列的所有项目都将被插入,然后仅由另一个后续刷新处理。
目标是消费者在 takeAll 上有一个 CAS 操作,然后可以迭代列表中的元素,而无需每次读取都经过 CAS 操作。此外,我们已经拥有节点(条目),因为需要它来存储其他一些不可变状态。新节点可以将 HEAD 作为构造函数参数,创建一个单向链表。
文献中是否存在具有这些特征的队列?
最佳答案
给你:
public class FunkyQueue<T> {
private final AtomicReference<Node<T>> _tail = new AtomicReference<Node<T>>();
public void offer(T t) {
while(true) {
Node<T> tail = _tail.get();
Node<T> newTail = new Node<T>(t, tail);
if(_tail.compareAndSet(tail, newTail)) {
break;
}
}
}
public List<T> takeAll() {
Node<T> tail = _tail.getAndSet(null);
LinkedList<T> list = new LinkedList<T>();
while(tail != null) {
list.addFirst(tail.get());
tail = tail.getPrevious();
}
return list;
}
private static final class Node<T>
{
private final T _obj;
private Node<T> _prev;
private Node(T obj, Node<T> prev) {
_obj = obj;
_prev = prev;
}
public T get() {
return _obj;
}
public Node<T> getPrevious() {
return _prev;
}
}
}
关于java - 具有offer和flush的非阻塞并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778921/