2.1 LinkedBlockingQueue是什么?
1.1 LinkedBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以链表的形式保存数据(双向链表,如果看过LinkedList的话,本文既不用看了,动态的增删链表长度实现队列)。常用的操作包括 add ,offer,put,remove,poll,take,peek。
1.2 构造函数:
1. 无参构造,其默认链表最大长度为2^31-1
public LinkedBlockingDeque();
2. 用户自定义最大链表长度的有参构造
public LinkedBlockingDeque(int capacity);
3. 用户传入集合,将集合中数据保存到链表中,改构造函数为线程安全,使用ReentrantLock锁,其默认链表最大长度为2^31-1
public LinkedBlockingDeque(Collection<? extends E> c);
1.3 链表结构:
在LinkedBlockingDeque中有一个Node的子类,该子类主要是存储我们数据,在子类中有三个重要的成员变量,分别是item,prev,next,其中item就是具体存储对象的值,prev是存储上一个元素的值,next存储下一个元素的值,其中prev指向的是上个元素的item值,next指向的是下个元素的item值,这样相互嵌套形成链表,由于通过任意个方向(从上到下或从下打上)都可以获取到元素的值,所以该结构又被成为双向链表;
1.4 数据添加:
1.4.1 add:
第一步:执行addLast方法,其中addLast调用offerLast方法,如果添加失败会抛出异常
第二步:获取成员变量中的锁,锁住这个对象,执行linkLast方法
第三步:将上一个元素的next执行下一个元素
1.4.2 offer:
第一步:和add差不多,不允许添加null值,不过和add方法不同的是,该方法添加失败不会抛出异常
1.4.3 put:
相对于offer(),如果元素数量与队列长度相等,会阻塞线程,其他的和offer()大致相对
1.4.4 push:
相对于add(),offer(),put(),push()方法是在链表头部进行添加值
1.5 数据删除:
1.5.1 remove:和poll()、take()一样从链表头部开始删除数据,不过remove方法如果元素不存在,会抛出异常,poll不会,而take()方法是如果队列为空,其他线程将会阻塞