ArrayBlockingQueue 是基于数组的有界阻塞队列,线程安全、FIFO,支持阻塞/超时/非阻塞操作;缺点是容量固定、单锁性能受限、不支持 null、迭代器弱一致性;适用于中等并发、容量可控场景。

ArrayBlockingQueue 是 Java 并发包(java.util.concurrent)中一个经典的**有界阻塞队列**,底层基于数组实现,线程安全,适合生产者-消费者模型。它支持 FIFO(先进先出)顺序,且在容量满或空时,相关操作会阻塞调用线程(可选超时)。
入队方法:
put(E e):阻塞式插入,若队列满则一直等待,直到有空间;不可中断(除非被中断,抛 InterruptedException)。offer(E e):非阻塞插入,成功返回 true,队列满则立即返回 false。offer(E e, long timeout, TimeUnit unit):带超时的插入,最多等待指定时间,超时仍无空间则返回 false。出队方法:
take():阻塞式获取并移除队首元素,若队列空则一直等待;同样可被中断。poll():非阻塞获取并移除,队列空时返回 null。poll(long timeout, TimeUnit unit):带超时的获取,超时未取到则返回 null。查看与状态方法:
立即学习“Java免费学习笔记(深入)”;
peek():仅查看队首元素(不移除),队列空时返回 null。size():返回当前元素个数(注意:不是剩余容量)。remainingCapacity():返回还可插入的元素数量(即 capacity - size())。isEmpty() / isFull()(需自行判断:size() == capacity)。固定容量,不可动态扩容
一旦初始化,容量就不可变。如果预估不准,容易出现频繁阻塞(容量小)或内存浪费(容量大),也不支持自动伸缩。
单锁(ReentrantLock)全局控制,吞吐量受限
虽然用的是可重入锁 + 条件队列(notEmpty 和 notFull),但所有读写操作都竞争同一把锁。高并发下,相比无锁队列(如 ConcurrentLinkedQueue)或双锁设计(如 LinkedBlockingQueue 的读写分离),性能瓶颈更明显。
不支持 null 元素
插入 null 会直接抛 NullPointerException。这限制了某些需要存 null 标记场景(比如表示“空值”或“占位符”)的使用。
迭代器弱一致性,不支持并发修改检测
其 iterator() 返回的迭代器是**弱一致性的**:不会抛 ConcurrentModificationException,但也不能保证反映某一时刻的精确快照——可能跳过新加入元素,也可能重复遍历已移除元素。不适合强一致性要求的遍历场景。
适合**容量可控、并发压力中等、对顺序和可靠性要求高**的场景,例如:
若需高吞吐、动态容量或允许 null,可考虑 LinkedBlockingQueue、ConcurrentLinkedQueue 或 PriorityBlockingQueue 等替代方案。
基本上就这些。用好 ArrayBlockingQueue 的关键是理解它的“有界”和“阻塞”特性,别把它当普通 ArrayList 用。
以上就是java ArrayBlockingQueue的方法及不足点的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号