ArrayBlockingQueue和LinkedBlockingQueue的区别
Java集合中的 ArrayBlockingQueue
和 LinkedBlockingQueue
是 BlockingQueue
接口的常见实现。
ArrayBlockingQueue
ArrayBlockingQueue
是Java中实现BlockingQueue接口的一个类。ArrayBlockingQueue类和它的迭代器实现了Collection和Iterator接口的所有可选方法。ArrayBlockingQueue是一个有边界的BlockingQueue,由一个数组支持。这里,有界意味着队列的大小是有限的和固定的。一旦创建,我们就不能扩大或缩小队列的大小。如果我们试图在一个满的队列中插入一个元素,那么它将导致操作阻塞。同样地,如果我们试图从一个空队列中取出一个元素,那么操作也会被阻塞。ArrayBlockingQueue内部以FIFO(先进先出)的顺序存储队列中的元素。位于队列头部或前端的元素是这个队列中所有元素中最古老的元素。队列尾部的元素是这个队列中所有元素中最新的元素。新的元素总是在队列的末端或尾部插入,而检索操作则在队列的头部获得元素。
LinkedBlockingQueue
LinkedBlockingQueue是Java中一个实现BlockingQueue接口的类。LinkedBlockingQueue是一个由链接节点支持的可选边界的BlockingQueue。这里,可选的约束意味着给LinkedBlockingQueue的容量是有约束的,否则,它将是无约束的。容量可以作为参数给到LinkedBlockingQueue的构造函数。如果没有指定的话,容量等于Integer.MAX_VALUE。LinkedBlockingQueue类和它的迭代器实现了Collection和Iterator接口的所有可选方法。LinkedBlockingQueue按照FIFO(先进先出)的顺序在内部存储队列中的元素。位于队列头部或前端的元素是这个队列中所有元素中最古老的元素。在队列尾部的元素是这个队列中所有元素中最新的元素。新的元素总是在队列的末端或尾部插入,而检索操作则在队列的头部获得元素。链接队列通常比基于数组的队列有更高的吞吐量,但在大多数并发应用中的性能不那么可预测。
链接阻塞队列示例代码:
// Java program to demonstrate LinkedBlockingQueue
import java.util.concurrent.LinkedBlockingQueue;
public class LinkedBlockingQueueDemo {
public static void main(String[] args)
{
// define capacity of LinkedBlockingQueue
int capacity = 15;
// create object of LinkedBlockingQueue
LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<Integer>(capacity);
// add numbers
lbq.add(1);
lbq.add(2);
lbq.add(3);
// print queue
System.out.println("LinkedBlockingQueue:" + lbq);
}
}
ArrayBlockingQueue示例:
// Java program to demonstrate
// ArrayBlockingQueue
import java.util.concurrent.ArrayBlockingQueue;
public class ArrayBlockingQueueDemo {
public static void main(String[] args)
{
// define capacity of ArrayBlockingQueue
int capacity = 15;
ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(capacity);
// add numbers
abq.add(1);
abq.add(2);
abq.add(3);
// print queue
System.out.println("ArrayBlockingQueue:" + abq);
}
}
ArrayBlockingQueue和LinkedBlockingQueue之间的区别 –
ArrayBlockingQueue | 链接阻塞队列(LinkedBlockingQueen) |
---|---|
ArrayBlockingQueue在内部将元素存储在一个数组中。 | LinkedBlockingQueen在内部将元素存储在链接节点中。 |
ArrayBlockingQueue是有界的,这意味着它的大小在创建后不会改变。 | LinkedBlockingQueue是有边界的,这意味着如果需要的话,它可以选择有一个上限。如果没有指定上界,Integer.MAX_VALUE被用作上界。 |
ArrayBlockingQueue的吞吐量比链接节点队列低。 | 它的吞吐量比基于数组的队列高。 |
ArrayBlockingQueue使用单锁双条件算法。它意味着生产者和消费者共享一个锁。 | LinkedBlockingQueen使用两个锁队列算法,它有两个锁条件putLock和takeLock,分别用于从队列中插入和删除元素。 |
ArrayBlockingQueue总是持有一个对象数组 | LinkedBlockingQueue是一个链接节点,有三个对象字段。 |