Queue 接口
Queue (队列)是一种先进先出的数据结构,队列是一种特殊的线性表,它只允 许在表的 端进行获取操作,在表的另端进行插入操作。
Queue顶层接口方法:
//添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常
boolean add(E e);
//添加一个元素,添加成功返回true, 如果队列满了,返回false
boolean offer(E e);
//返回并删除队首元素,队列为空则抛出异常
E remove();
//返回并删除队首元素,队列为空则返回null
E poll();
//返回队首元素,但不移除,队列为空则抛出异常
E element();
//获取队首元素,但不移除,队列为空则返回null
E peek();
�BlockingQueue接口
堵塞队列BlockingQueue 继承了 Queue 接口,新增了堵塞队列的方法put,take
应用场景:生产者、消费者模式,因为BlockingQueue是线程安全的,所以生产者、消费者可以是多线程的
ArrayBlockingQueue
应用场景:生产者-消费者模型,如果生产速度和消费速度基本匹配的情况下,可以使用 ArrayBlockingQueue
缺点:使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象,高并发情况下有性能瓶颈
特性:
对应源码:
/** 数组结构 */
final Object[] items;
//下一个待取出元素索引
int takeIndex;
//下一个待添加元素索引
int putIndex;
//元素个数
int count;
// 核心:一把锁,两个条件,利用了Lock锁的Condition通知机制进行阻塞控制。
final ReentrantLock lock;
//不为空,可以唤醒消费者
private final Condition notEmpty;
//没有满,可以唤醒生产者
private final Condition notFull;
设计精髓:环形数组,双指针
出队时数组index对象置为null,taskIndex++, 时间复杂度0(1), 普通数组删除一个对象 是O(n)
LinkedBlockingQueue
一个基于链表实现的阻塞队列,特性