Java:ArrayBlockingQueue 与 LinkedBlockingQueue

标签 java multithreading synchronization queue

我认为,在大多数情况下,ArrayBlockingQueue 的性能会优于 LinkedBlockingQueue。然而,当数组中总是有足够的空间时就是这种情况......如果它变满了,它是否会表现得那么好就不是很可预测了,因为它会阻塞试图将数据插入队列的线程...... .

所以,我的问题是:BlockingQueue 是否有任何中间实现?比如,ArrayListBlockingQueue 还是 BucketListBlockingQueue?像数组列表这样的东西,这样队列可以动态增加容量,同时仍然从使用数组最终存储数据中获得合理的好处?

最佳答案

1 。 LinkedBlockingQueue ( LinkedList 实现,但不完全是 LinkedList 的 JDK 实现。它使用 static inner class Node 来维护之间的链接元素)

Constructor for LinkedBlockingQueue
public LinkedBlockingQueue(int capacity) 
{
        if (capacity < = 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node< E >(null);   // Maintains a underlying linkedlist. ( Use when size is not known )
}

Node 类用来维护Links

static class Node<E> {
    E item;
    Node<E> next;
    Node(E x) { item = x; }
}

2。 ArrayBlockingQueue(数组实现)

ArrayBlockingQueue 的构造函数

public ArrayBlockingQueue(int capacity, boolean fair) 
{
            if (capacity < = 0)
                throw new IllegalArgumentException();
            this.items = new Object[capacity]; // Maintains a underlying array
            lock = new ReentrantLock(fair);
            notEmpty = lock.newCondition();
            notFull =  lock.newCondition();
}

ArrayBlockingQueueLinkedBlockingQueue 最大的区别从构造函数上就很明显了,一个底层数据结构是Array,另一个是链表.

ArrayBlockingQueue 使用 single-lock double condition algorithm LinkedBlockingQueue 是“双锁队列”算法的变体,它有 2 个锁和 2 个条件(takeLock,putLock)

到现在为止,我对这两种实现进行了比较 回到原来的问题,在 concurrency mailing list 中提出了类似的问题在这篇文章中,Doug Lea 谈到了 DynamicArrayBlockingQueue,它是 implementation provided by Dawid Kurzyniec.

关于Java:ArrayBlockingQueue 与 LinkedBlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17061882/

相关文章:

OpenCV显示视频无遗漏无撕裂

Android LogCat 不断重复警告 : "Addition of standard header .... not allowed"

java - 对tomcat的套接字http请求,但响应302

java - 当我从扩展特定接口(interface)的类创建对象时,我可以在使用该接口(interface)的地方使用该对象吗?

java - 混淆 "super"关键字在此上下文中的作用

Android:在特定内核中运行进程或线程

java - SimpleDateFormat 错误地解析字符串

c - 使用用户输入在 C 中跨线程同步数据

java - 不稳定的 StampedLock.unlock(long) 行为?

java - session 同步的目的是什么