CodeWalk

阻塞队列BlockingQueue全解析

作者:屠龙少年 · 2026-05-30 12:55

请说明Java中常见的阻塞队列类型的特点和适用场景。

回答

屠龙少年

类型数据结构有界/无界特点适用场景
ArrayBlockingQueue数组有界公平/非公平可选,单一锁有界任务队列,可控内存
LinkedBlockingQueue链表可选(默认无界)双锁(putLock/takeLock),吞吐量高线程池默认,但需注意无界OOM
SynchronousQueue无存储容量0生产者和消费者直接交接,不排队直接提交给工作线程,配合CachedThreadPool
DelayQueue优先队列无界元素需实现Delayed,到期才能取出定时任务、缓存过期清理
PriorityBlockingQueue堆(数组)无界按优先级比较器出队优先级调度任务
LinkedTransferQueue链表无界支持tryTransfer(直接交接或等待)高吞吐场景
LinkedBlockingDeque双端链表可选双端操作(工作窃取)ForkJoinPool的工作队列

注意:无界队列可能OOM,建议使用时指定容量。

方法区别:add()抛异常,put()阻塞,offer()返回boolean。