Queue 接口

Queue (队列)是一种先进先出的数据结构,队列是一种特殊的线性表,它只允 许在表的 端进行获取操作,在表的另端进行插入操作。
Queue顶层接口方法:

  1. //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常
  2. boolean add(E e);
  3. //添加一个元素,添加成功返回true, 如果队列满了,返回false
  4. boolean offer(E e);
  5. //返回并删除队首元素,队列为空则抛出异常
  6. E remove();
  7. //返回并删除队首元素,队列为空则返回null
  8. E poll();
  9. //返回队首元素,但不移除,队列为空则抛出异常
  10. E element();
  11. //获取队首元素,但不移除,队列为空则返回null
  12. E peek();

�BlockingQueue接口

堵塞队列BlockingQueue 继承了 Queue 接口,新增了堵塞队列的方法put,take
image.png
应用场景:生产者、消费者模式,因为BlockingQueue是线程安全的,所以生产者、消费者可以是多线程的

ArrayBlockingQueue

应用场景:生产者-消费者模型,如果生产速度和消费速度基本匹配的情况下,可以使用 ArrayBlockingQueue
缺点:使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象,高并发情况下有性能瓶颈
特性:
image.png
对应源码:

  1. /** 数组结构 */
  2. final Object[] items;
  3. //下一个待取出元素索引
  4. int takeIndex;
  5. //下一个待添加元素索引
  6. int putIndex;
  7. //元素个数
  8. int count;
  9. // 核心:一把锁,两个条件,利用了Lock锁的Condition通知机制进行阻塞控制。
  10. final ReentrantLock lock;
  11. //不为空,可以唤醒消费者
  12. private final Condition notEmpty;
  13. //没有满,可以唤醒生产者
  14. private final Condition notFull;

设计精髓:环形数组,双指针
出队时数组index对象置为null,taskIndex++, 时间复杂度0(1), 普通数组删除一个对象 是O(n)
image.png

LinkedBlockingQueue

一个基于链表实现的阻塞队列,特性
image.png