当前位置: 首页 > 知识库问答 >
问题:

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

鲜于阳
2023-03-14

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

我需要一个基本上只有2个操作的无界非阻塞并发队列:

  • 提供:在此队列的尾部自动插入指定项;
  • flush:获取队列中在该时刻出现的所有项,并开始按照插入顺序逐一处理它们。更具体地说,必须是原子的只是这个“TakeAll”操作,它将是flush的第一个操作。takeAll之后提供给队列的所有项都将被插入,然后仅由另一个后续刷新处理。

目标是使用者在takeAll上有一个CAS操作,然后可以迭代列表中的元素,而不需要每次读取都经历CAS操作。此外,我们已经拥有了节点(条目),因为它需要存储一些其他不可变的状态。新节点可以将HEAD作为构造函数参数,从而创建一个单向链表。

文学中是否存在具有这些特征的队列?

共有1个答案

濮阳旺
2023-03-14

给你:

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;
        }
    }
}
 类似资料:
  • 问题内容: 我有一个经典的问题,线程将事件推送到第二个线程的传入队列。仅这次,我对性能非常感兴趣。我要实现的是: 我想要并发访问队列,生产者推送,接收者弹出。 当队列为空时,我希望消费者阻止队列,等待生产者。 我的第一个想法是使用,但是我很快意识到它不是并发的,并且会降低性能。另一方面,我现在使用,但仍要为每个出版物支付/ 的费用。由于使用者在找到空队列时不会阻塞,因此我必须进行同步并处于锁定状态

  • 9.7. 示例: 并发的非阻塞缓存 本节中我们会做一个无阻塞的缓存,这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题。这个问题叫作缓存(memoizing)函数(译注:Memoization的定义: memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、me

  • 我有一个应用程序,在其中按下开始按钮后,服务将开始轮询几个传感器,每当传感器值发生变化时,将传感器数据存储到某个对象中。每10毫秒,就会发生一次数据库插入,获取对象的当前值并将其存储到数据库中。这会发生30分钟 考虑到插入的速度和持续时间,我想在一个独立于UI线程的线程中运行它,这样导航就不会受到影响。因此,我的服务将通过将数据添加到队列中来为线程提供一些数据,然后另一个线程(消费者)将从队列中取

  • 我希望实现具有以下特征的数据结构: 推送:将元素添加到列表的前面。 读取 :读取列表中的所有元素 < li >固定大小:列表不应超过指定的阈值,如果超过该阈值,它应自动从末尾(最早的项目)截断。这不需要严格执行,但是一旦列表超过阈值,它最终会被截断。 < li >并发安全:该结构应该安全地容纳多个并行推送器和读取器 < li >非阻塞:这是真正的问题。我想使用不带锁的实现。如果可能的话,许多线程应

  • 本文向大家介绍Java并发编程之阻塞队列详解,包括了Java并发编程之阻塞队列详解的使用技巧和注意事项,需要的朋友参考一下 1、什么是阻塞队列?   队列是一种数据结构,它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素。阻塞队里与普通的队列的区别在于,普通队列不会对当前线程产生阻塞,在面对类似消费者-生产者模型时,就必须额外的实现同步策略以及线程间唤醒策略。使用阻塞队列,就会对当前

  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?