arrayblockingqueue是基于数组的线程安全有界阻塞队列,使用reentrantlock和两个condition(notfull、notempty)实现生产者-消费者阻塞与唤醒;容量固定,支持公平性配置,put/take阻塞等待,offer/poll可选超时或立即返回。

ArrayBlockingQueue 是 Java 中基于数组实现的有界阻塞队列,天然支持线程安全,非常适合用于生产者-消费者模型。它内部使用 ReentrantLock 和 Condition 实现等待/通知机制,当队列满时生产者阻塞,队列空时消费者阻塞。
核心原理:阻塞与唤醒靠 Condition
ArrayBlockingQueue 内部维护两个 Condition:
- notFull:供生产者等待(队列未满时才允许入队)
- notEmpty:供消费者等待(队列非空时才允许出队)
每次 put() 或 take() 操作都会在加锁后检查条件,不满足就调用 await() 挂起当前线程;另一方操作完成后调用 signal() 唤醒对应等待队列中的一个线程。
简单示例:一个生产者 + 一个消费者
以下代码演示基础用法(省略异常处理):
// 创建容量为 3 的阻塞队列
ArrayBlockingQueue<string> queue = new ArrayBlockingQueue(3);
// 生产者线程
new Thread(() -> {
for (int i = 0; i {
for (int i = 0; i
</string>
注意事项和实用技巧
- 容量必须指定且不可变:构造时传入 int capacity,后续不能扩容
- 支持公平性选择:第二个参数可设为 true,使等待线程按 FIFO 被唤醒(默认 false,非公平)
- 避免死锁或假唤醒:不要在循环外使用 await(),但 ArrayBlockingQueue 已封装好,直接用 put/take 即可
- 区分 offer/poll 与 put/take:前者带超时或立即返回 null/false,后者是无界等待(除非中断)
扩展:多个生产者 + 多个消费者
只需启动多个线程调用相同 queue 的 put() 或 take() 即可,ArrayBlockingQueue 的所有方法都是线程安全的,无需额外同步。例如:
- 启动 3 个生产者线程,各自循环 put
- 启动 2 个消费者线程,各自循环 take
- 底层锁和 condition 自动协调竞争与等待关系
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











