linkedblockingqueue默认是有界队列,容量为integer.max_value(约21亿),逻辑上近似无界但物理内存有限,易因任务堆积导致oom;需显式设置合理容量并配拒绝策略。

Java 中 LinkedBlockingQueue 默认构造函数创建的是**有界队列**(容量为 Integer.MAX_VALUE),但它常被当作“无界”来用——实际是**逻辑上无界、物理上限极高**的阻塞队列。严格来说,Java 没有真正无界的阻塞队列实现,LinkedBlockingQueue 是最接近且线程安全的选择。
为什么说 LinkedBlockingQueue “近似无界”?
它内部使用链表结构,节点动态创建;默认构造时传入容量 Integer.MAX_VALUE(约 21 亿),内存耗尽前几乎不会因容量满而阻塞。注意:这不是无限内存,而是上限极大,适合大多数高吞吐场景。
基本用法:创建与核心操作
直接调用无参构造即可获得“无界”行为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
LinkedBlockingQueue<string> queue = new LinkedBlockingQueue();</string>- 生产者调用
put()—— 若队列满(极罕见)则阻塞,否则立即插入 - 消费者调用
take()—— 若队列空则阻塞,否则立即取出并返回 - 也可用非阻塞方法如
offer()和poll(),它们失败时返回false或null
典型生产者-消费者示例
以下是一个简化但完整的线程协作模型:
- 启动一个生产者线程,循环调用
queue.put("item" + i),每秒放一个 - 启动一个消费者线程,循环调用
queue.take(),拿到即打印 - 两者自动协调:生产快时队列增长,消费快时等待,无需额外同步
- 注意:若需优雅关闭,建议配合
Thread.interrupt()和检查中断状态
注意事项与常见陷阱
不要误以为绝对无界:当元素数量逼近 Integer.MAX_VALUE 时,put() 会阻塞,且可能引发 OutOfMemoryError(取决于对象大小和堆内存)。
- 监控队列大小(
queue.size())有助于发现异常积压 - 避免在循环中无节制
put()而不控制速率,否则内存可能撑爆 - 若需真正可控的背压机制,考虑搭配
Semaphore或使用Flow API(Java 9+) - 相比
ArrayBlockingQueue,它锁分离(putLock/takeLock),吞吐更高,但内存占用略大
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










