面试题答案
一键面试-
ArrayBlockingQueue
- 容量限制:有界队列,在创建时需指定容量大小。
- 入队出队策略:基于数组实现,内部使用ReentrantLock进行线程安全控制,使用Condition实现等待和唤醒机制。入队(
offer
、put
等方法)时,如果队列已满,put
方法会阻塞直到有空间可用,offer
方法会返回false
(非阻塞);出队(poll
、take
等方法)时,如果队列已空,take
方法会阻塞直到有元素可用,poll
方法会返回null
(非阻塞)。元素按FIFO(先进先出)顺序处理。
-
LinkedBlockingQueue
- 容量限制:可指定容量,也可使用无参构造创建一个默认容量为
Integer.MAX_VALUE
的无界队列。 - 入队出队策略:基于链表实现,内部使用两把锁(
takeLock
和putLock
)分别控制出队和入队操作,提高并发性。入队(offer
、put
等方法)和出队(poll
、take
等方法)策略与ArrayBlockingQueue
类似,元素按FIFO顺序处理。
- 容量限制:可指定容量,也可使用无参构造创建一个默认容量为
-
SynchronousQueue
- 容量限制:容量为0,不存储任何元素。
- 入队出队策略:每个插入操作必须等待另一个线程的移除操作,反之亦然。它支持公平性选择,构造时可传入
fair
参数,true
表示公平模式,即按照FIFO顺序处理线程;false
表示非公平模式。使用transfer
方法时,如果没有消费者在等待接收元素,该方法会阻塞直到有消费者出现;offer
方法是非阻塞的,如果没有消费者等待,立即返回false
。
-
PriorityBlockingQueue
- 容量限制:无界队列,会根据需要自动扩容。
- 入队出队策略:基于堆数据结构实现,元素按照自然顺序或者自定义的比较器顺序排序。入队(
offer
、put
等方法)操作总是成功,因为队列是无界的。出队(poll
、take
等方法)时会返回队列中优先级最高(排序最靠前)的元素。如果队列为空,take
方法会阻塞直到有元素可用,poll
方法会返回null
。
-
DelayQueue
- 容量限制:无界队列,会根据需要自动扩容。
- 入队出队策略:队列中的元素必须实现
Delayed
接口,该接口继承自Comparable
接口。元素只有在延迟时间到期后才能从队列中取出。入队操作(offer
、put
等方法)总是成功,因为队列是无界的。出队(poll
、take
等方法)时,poll
方法如果队头元素延迟时间未到,返回null
;take
方法会阻塞直到队头元素延迟时间到期。