题目重点:比较 ConcurrentLinkedQueue 与有界 BlockingQueue,解释生产消费系统的容量。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 没有指定队列类;比较两种代表性合同,不把它们混成一种实现。
解题路线
- ConcurrentLinkedQueue 是非阻塞的无界 FIFO 队列,不提供等待元素的 take。非阻塞不意味着每个线程都在有限步内完成。
- 有界 BlockingQueue 提供生产/消费等待与容量;ArrayBlockingQueue 的固定数组和阻塞协调适合明确资源上限,LinkedBlockingQueue 的容量也应显式设定。
- poll 返回无元素不保证下一刻仍为空;禁止先看 size 再决定取。取消与关闭需要协议,哨兵数量与消费者数量相符或采用显式状态。
- 容量围绕允许等待时间和消费者吞吐选择,满时阻塞、拒绝或丢弃必须符合业务。无界队列将过载转成延迟和内存积累。
手动走一遍
生产速率持续1000/s、消费800/s,积压每秒约200条;无界结构也不能解决容量不足。队列容量400、稳定消费800/s时,只能粗估约0.5秒积压服务量;波动和任务长尾需要另外测量。
规模与取舍
链式队列节点有分配与缓存局部性成本;数组固定容量更可预测。非阻塞进展保证、延迟和吞吐分别测。
易错点与追问
容易失分的边界
- 所有并发队列都有相同实现。
- 用 size+poll 当原子消费。
- 无界意味着无需背压。
继续深挖
- 多消费者如何保证按业务键有序?
- 任务失败重试怎样避免阻塞新任务?
