ArrayBlockingQueue 源码分析
ArrayBlockingQueue 是基于数组的有界阻塞队列,生产者与消费者共用一把 ReentrantLock,通过两个 Condition 实现「队满等待 / 队空等待」。
核心概念
内部环形数组 + takeIndex/putIndex/count 维护头尾与元素个数。构造时可指定公平/非公平锁。实现 BlockingQueue:put 队满阻塞,take 队空阻塞;还有 offer/poll 超时非阻塞变体。单锁设计简单,高并发下锁竞争可能成为瓶颈。
关键机制与实践
入队:lock → while 满则 notFull.await → 写入数组 → 更新索引 → notEmpty.signal → unlock。出队对称。size() 在锁内读取 count,一致性好。线程池 ThreadPoolExecutor 常用有界队列配合拒绝策略,防止无界堆积 OOM。
1 | BlockingQueue<Task> q = new ArrayBlockingQueue<>(100); |
常见误区与小结
- 与
LinkedBlockingQueue混淆:后者默认无界(或指定容量)、通常两把锁。 - 忽略
fair=true对吞吐的影响(更公平但更慢)。 - 队列为 null 元素(
ArrayBlockingQueue不允许 null)。
选型:需要固定容量、内存紧凑时用 ArrayBlockingQueue;极高并发可考虑 LinkedBlockingQueue 或 Disruptor。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dai Wei!
评论

