内容来自《收割Offer:互联网大厂面经》

面试官提问

● 请对几种重要队列进行对比,并说明它们的使用场景和实现方式。(偶尔也会要求求职者写代码实现一个队列。)

Java有5种重要的队列,下面就对这5种队列分别进行说明。

1 ArrayBlockingQueue队列

基于数组实现的有界阻塞队列,添加和删除操作使用同一把锁。元素先进先出,常与线程池结合使用。

2 LinkedBlockingQueue队列

基于链表实现的有界阻塞队列,不设置大小时是Integer.MAX_VALUE,添加和删除操作是两把独立的锁,锁竞争较小。元素先进先出,常与线程池结合使用。

3 SynchronousQueue队列

同步握手队列,内部容量为零,笔者在工作中遇到的使用场景是定时任务的触发与执行。当执行时机到来时,交由线程池执行任务,如果队列很长,那么任务可能因为排队等待而与执行时机不符。队列长度为0,通过不断地新建线程来处理任务的方式可以保证定时任务的按时执行。

4 无锁队列

比如MPSC、Ring Buff等,常使用缓存行的填充避免伪共享,以及CAS操作避免锁竞争来优化性能。