阻塞队列BlockingQueue全解析
请说明Java中常见的阻塞队列类型的特点和适用场景。
回答
屠龙少年
| 类型 | 数据结构 | 有界/无界 | 特点 | 适用场景 |
|---|---|---|---|---|
| ArrayBlockingQueue | 数组 | 有界 | 公平/非公平可选,单一锁 | 有界任务队列,可控内存 |
| LinkedBlockingQueue | 链表 | 可选(默认无界) | 双锁(putLock/takeLock),吞吐量高 | 线程池默认,但需注意无界OOM |
| SynchronousQueue | 无存储 | 容量0 | 生产者和消费者直接交接,不排队 | 直接提交给工作线程,配合CachedThreadPool |
| DelayQueue | 优先队列 | 无界 | 元素需实现Delayed,到期才能取出 | 定时任务、缓存过期清理 |
| PriorityBlockingQueue | 堆(数组) | 无界 | 按优先级比较器出队 | 优先级调度任务 |
| LinkedTransferQueue | 链表 | 无界 | 支持tryTransfer(直接交接或等待) | 高吞吐场景 |
| LinkedBlockingDeque | 双端链表 | 可选 | 双端操作(工作窃取) | ForkJoinPool的工作队列 |
注意:无界队列可能OOM,建议使用时指定容量。
方法区别:add()抛异常,put()阻塞,offer()返回boolean。