java - 具有offer和flush的非阻塞并发队列

标签 java multithreading concurrency

非阻塞并发队列提供和刷新

我需要一个基本上只有 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/

相关文章:

java - 对 Java ArrayList 的一部分进行排序

java - 我应该在哪里设置逻辑以正确更新我的小部件?

java - 带 double 的 RandomList 不显示随机变量

c# - ObjectPool 实现死锁

c# - 一个 ActionBlock 可以链接到另一个包含更多参数的 ActionBlock 吗?

java - 如何关闭 CompletionService

c++ - 进程和线程

java - Android Message 'what' 代码是否需要在处理程序或线程范围内是唯一的?

multithreading - 在tomcat中使用多线程处理websocket incomming消息

java - 实现不抛出 InterruptedException 的接口(interface)时处理 InterruptedException 的正确方法