1.概述
- LinkedBlockingQueue内部由单链表实现,只能从head取元素,从tail添加元素。
- 添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写操作可以并行执行。LinkedBlockingQueue采用可重入锁(ReentrantLock)来保证在并发情况下的线程安全。
- LinkedBlockingQueue可以指定边界,也可以是无边界
2.构造器
LinkedBlockingQueue一共有三个构造器,分别是无参构造器、可以指定容量的构造器、可以传入一个容器的构造器。
如果在创建实例的时候调用的是无参构造器,LinkedBlockingQueue的默认容量Integer.MAX_VALUE,这样做很可能会导致队列还没有满,但是内存却已经满了的情况(内存溢出)。
public LinkedBlockingQueue() //设置容量为Integer.MAX
public LinkedBlockingQueue(int capacity) //设置指定容量
public LinkedBlockingQueue(Collection<? extends E> c) //传入一个容器,如果调用该构造器,
//容量默认也是Integer.MAX_VALUE
3.LinkedBlockingQueue常用操作
3.1 取数据
- take():首选。当队列为空时阻塞
- poll():弹出队顶元素,队列为空时,返回空
- peek():和poll烈性,返回队队顶元素,但顶元素不弹出。队列为空时返回null
- remove(Object o):移除某个元素,队列为空时抛出异常。成功移除返回true
3.2 添加数据
- put():首选。队满是阻塞
- offer():队满时返回false
3.3 其它
- isEmtpy():判定队列是否为空
- size():队列大小