ArrayBlockingQueue是Java中线程安全、有界、基于数组的阻塞队列,容量固定且创建时必须指定,支持公平/非公平锁;满时生产者阻塞,空时消费者阻塞,不支持null元素。

ArrayBlockingQueue 是 Java 并发包(java.util.concurrent)中一个线程安全、有界、基于数组实现的阻塞队列。它支持生产者-消费者模式,当队列满时,生产者线程会阻塞;当队列空时,消费者线程会阻塞。
创建与初始化
必须指定容量大小(不可为 0),可选是否启用公平锁(默认非公平):
- 基本用法:
new ArrayBlockingQueue<String>(10)—— 容量为 10,非公平策略 - 启用公平锁:
new ArrayBlockingQueue<String>(10, true)—— 公平模式下,等待最久的线程优先获取锁,但吞吐量略低
核心操作方法及阻塞行为
关键方法按“是否阻塞”和“是否抛异常”分类:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
put(E e):插入元素,队列满时阻塞,直到有空间 -
take():移除并返回头元素,队列空时阻塞,直到有元素 -
offer(E e, long timeout, TimeUnit unit):带超时的插入,超时未成功则返回false -
poll(long timeout, TimeUnit unit):带超时的移除,超时无元素则返回null -
offer(E e)和poll()是非阻塞版本,失败立即返回false或null,不推荐在强一致性场景下单独使用
典型生产者-消费者示例
两个线程协作,共享一个容量为 3 的队列:
立即学习“Java免费学习笔记(深入)”;
- 生产者每秒放一个字符串,若队列满则等待;
- 消费者每 2 秒取一个,若为空则等待;
- 注意:需显式关闭或用
shutdownNow()终止线程,避免无限等待
注意事项与常见陷阱
使用时需特别关注以下几点:
- 容量固定,创建后无法扩容,设计阶段就要预估峰值负载
- 内部使用单个
ReentrantLock控制所有操作,高并发下可能成为瓶颈(相比ConcurrentLinkedQueue等无锁结构) - 公平模式会降低吞吐量,仅在需要严格 FIFO 响应顺序时启用
- 不支持
null元素,插入null会抛NullPointerException

















