面试题答案
一键面试ArrayBlockingQueue
- 特点:
- 基于数组实现的有界阻塞队列,队列的容量在创建时就已确定,后续无法改变。
- 按照FIFO(先进先出)原则对元素进行排序。
- 支持公平锁和非公平锁,默认使用非公平锁,公平锁会降低吞吐量,但能保证线程获取锁的顺序是按照请求顺序。
- 应用场景:适用于已知任务数量,需要限制队列大小以控制资源消耗的场景,例如固定大小的缓存队列。
LinkedBlockingQueue
- 特点:
- 基于链表实现的阻塞队列,可选有界或无界(若构造函数不传容量参数则为无界)。
- 按照FIFO原则对元素进行排序。
- 由于链表结构,在队列头部和尾部操作元素效率较高。
- 应用场景:适用于任务量不确定,需要一个较大容量队列来缓冲任务的场景,如高并发的消息队列。
SynchronousQueue
- 特点:
- 不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,反之亦然。
- 队列本身不存储数据,因此吞吐量高于其他有容量的队列。
- 可用于传递性设计模式,如生产者 - 消费者模式中,生产者和消费者之间直接传递数据。
- 应用场景:适用于希望立即处理任务,不希望任务在队列中等待的场景,比如实时性要求较高的系统。
PriorityBlockingQueue
- 特点:
- 基于堆结构实现的无界阻塞队列,元素按照自然顺序或者自定义比较器的顺序进行排序。
- 队列中的元素必须实现
Comparable
接口或者在构造函数中传入Comparator
。 - 由于是无界队列,向队列添加元素不会阻塞,除非系统资源耗尽。
- 应用场景:适用于需要根据任务优先级进行处理的场景,例如任务调度系统,高优先级任务优先执行。
选择因素
- 任务数量:若任务数量已知且有限,
ArrayBlockingQueue
可有效控制资源;若任务量不确定,LinkedBlockingQueue
或PriorityBlockingQueue
(无界)更合适。 - 实时性要求:对实时性要求高,希望任务不等待直接处理,
SynchronousQueue
是较好选择。 - 任务优先级:若任务有优先级之分,需按优先级处理,应选择
PriorityBlockingQueue
。 - 性能考量:在高并发场景下,
SynchronousQueue
吞吐量较高;而LinkedBlockingQueue
由于链表结构在操作效率上有优势,ArrayBlockingQueue
在控制队列大小和资源消耗方面更具优势。