📅  最后修改于: 2023-12-03 15:13:29.827000             🧑  作者: Mango
ArrayBlockingQueue
和 LinkedBlockingQueue
是 Java 中提供的两种阻塞队列,它们都是线程安全的,但在实现原理和使用场景上有所不同。
ArrayBlockingQueue
类是一个基于数组结构实现的有界阻塞队列,其大小在创建时就确定了。当队列满时,添加元素的操作会被阻塞;当队列为空时,取出元素的操作会被阻塞。
public ArrayBlockingQueue(int capacity) {
this(capacity, false);
}
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
ArrayBlockingQueue
内部使用了 ReentrantLock 和 Condition 来保证线程安全和阻塞机制。
LinkedBlockingQueue
类是一个基于链表结构实现的有界或无界阻塞队列,默认情况下大小是无限的。当队列空时,获取元素的操作会被阻塞;当队列满时,添加元素的操作会被阻塞。
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
public LinkedBlockingQueue(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node<E>(null);
}
LinkedBlockingQueue
也使用了 ReentrantLock 和 Condition 来保证线程安全和阻塞机制。
ArrayBlockingQueue
是一个基于数组的阻塞队列,因此其大小是有界的,而 LinkedBlockingQueue
是一个基于链表的阻塞队列,大小可以选择有界也可以选择无界。ArrayBlockingQueue
内部使用了可重入锁和条件变量来实现阻塞队列,而 LinkedBlockingQueue
内部使用了锁和条件变量来实现阻塞队列。ArrayBlockingQueue
和 LinkedBlockingQueue
使用了不同的实现方式,因此它们的性能表现也不同。在高并发场景下,LinkedBlockingQueue
可能会更好一些,而在低并发场景下,ArrayBlockingQueue
的性能则更高。综上所述,ArrayBlockingQueue
和 LinkedBlockingQueue
都是线程安全的阻塞队列,但在实现原理、大小限制和性能表现上有所不同。根据实际需求,选择合适的阻塞队列可以使程序更加高效稳定。