当前位置: 首页 > 面试题库 >

有界,自动丢弃,无阻塞,并发收集

华凡
2023-03-14
问题内容

我正在寻找一个收藏集:

  • Deque/ List-即支持在“顶部”(最新项移到顶部)- deque.addFirst(..)/中插入元素list.add(0, ..)。可以是Queue,但是迭代顺序应该相反-即,最近添加的项应排在第一位。
  • 有界-即限制为20件
  • 达到容量上限时,自动丢弃最旧的项目(“在底部”的那些,首先添加)
  • 非阻塞-如果双端队列为空,则检索不应阻塞。如果双端队列已满,则也不应阻止/返回false / null / throw异常。
  • 并发-多个线程应该能够对其进行操作

我可以LinkedBlockingDeque将其包装到我的自定义集合中,add该集合在操作时会检查大小并丢弃最后一个项目。有更好的选择吗?


问题答案:

我做了一个简单的实现:

public class AutoDiscardingDeque<E> extends LinkedBlockingDeque<E> {

    public AutoDiscardingDeque() {
        super();
    }

    public AutoDiscardingDeque(int capacity) {
        super(capacity);
    }

    @Override
    public synchronized boolean offerFirst(E e) {
        if (remainingCapacity() == 0) {
            removeLast();
        }
        super.offerFirst(e);
        return true;
    }
}

就我的需求而言,这已经足够了,但是它应该是经过证明的方法,不同于addFirst/ offerFirst仍然遵循阻塞双端队列的语义。



 类似资料:
  • 目前我们有LinkedBlockingQueue和Con的LinkedQueue。 LinkedBlockingQueue可以有界,但它使用锁。 ConcurrentLinkedQueue不使用锁,但它不受限制。而这并不是阻碍投票的原因。 显然,我不能有一个既阻塞又无锁的队列(无等待或非阻塞或其他东西)。我不要求学术定义。 有人知道一个队列实现,它基本上是无锁的(不在热路径中使用锁),空时阻塞(不

  • 问题内容: 我可以找到的唯一一个是BoundedFIFOBuffer,它已被弃用。还有其他吗? 问题答案: 在Apache Commons Collections中(我假设这是您所指的)并没有被弃用,它只是移动了软件包。原来的in 已弃用,而已移至

  • 具有offer和flush的非阻塞并发队列 我需要一个基本上只有2个操作的无界非阻塞并发队列: 提供:在此队列的尾部自动插入指定项; flush:获取队列中在该时刻出现的所有项,并开始按照插入顺序逐一处理它们。更具体地说,必须是原子的只是这个“TakeAll”操作,它将是flush的第一个操作。takeAll之后提供给队列的所有项都将被插入,然后仅由另一个后续刷新处理。 目标是使用者在takeAl

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

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

  • 问题内容: 什么是“非阻塞”并发,它与使用线程的普通并发有何不同?为什么在所有需要并发的场景中不使用非阻塞并发呢?使用非阻塞并发是否有开销? 我听说Java中提供了非阻塞并发。在某些特殊情况下,我们应该使用此功能吗? 在集合中使用这些方法之一有什么区别或优势?权衡是什么? 第三季度示例: 与 这些问题更多是从学习/理解的角度来看的。感谢您的关注。 问题答案: 什么是非阻塞并发?它有什么不同。 正式