Queue 接口
Queue (队列)是一种先进先出的数据结构,队列是一种特殊的线性表,它只允 许在表的 端进行获取操作,在表的另端进行插入操作。
Queue顶层接口方法:
//添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常boolean add(E e);//添加一个元素,添加成功返回true, 如果队列满了,返回falseboolean offer(E e);//返回并删除队首元素,队列为空则抛出异常E remove();//返回并删除队首元素,队列为空则返回nullE poll();//返回队首元素,但不移除,队列为空则抛出异常E element();//获取队首元素,但不移除,队列为空则返回nullE 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
一个基于链表实现的阻塞队列,特性
