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

Boz*_*zho 8 java collections

我正在寻找一个集合:

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

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

Boz*_*zho 8

我做了这个简单的imeplementation:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于我的需求,这已经足够了,但它应该是记录良好的方法,而不是addFirst/ offerFirst仍然遵循阻塞双端队列的语义.

  • 您需要同步您使用的方法,否则结果不是线程安全的 - 多个线程可以同时运行offerFirst,从而导致奇怪的结果. (4认同)