并发编程:LinkedBlockingQueue源码浅析
申明:本文是基于jdk1.8的源码
LinkedBlockingQueue类图结构
LinkedBlockingQueue底层基于单向链表实现的阻塞队列,可以当做*队列也可以当做有界队列来使用。
为什么可以当做*队列?
从第一个无参构造方法可知,在没有指定容量大小的时候,默认容量为
Integer.MAX_VALUE=2的32次方-1=2147483647
这个确实也够大了,所以很多人都把他当成*。
从上面的构造方法中可以得出3点结论:
-
当调用无参的构造方法时,容量是int的最大值
-
队列中至少包含一个节点,哪怕队列对外表现为空
-
LinkedBlockingQueue不支持null元素
对于LinkedBlockingQueue需要掌握以下几点
-
创建
-
入队(添加元素)
-
出队(删除元素)
数据节点Node
LinkedBlockingQueue的组成:
一个链表+两把锁+两个条件
入队
LinkedBlockingQueue 提供了多种入队操作的实现来满足不同情况下的需求,入队操作有如下几种:
add()方法时父类里实现的,本类里是没有实现的,入队成功返回true,入队失败抛出 IllegalStateException 异常。
最终调用的是offer方法。
offer()方法
在队尾插入一个元素,
-
容量没满,可以立即插入,返回true;
-
队列满了,直接返回false
注:如果使用了限制了容量的队列,这个方法比add()好,因为add()插入失败就会抛出异常
enqueue()方法
offer()方另外的一种方法就是设置等待时间
put()方法
1:没有返回值
2:当队列为满队时,再想往队列里添加元素则需要阻塞等待
每次队列元素添加完毕后,采用原子类AtomicInteger加一
出队
LinkedBlockingQueue 也提供了多种出队操作的实现来满足不同情况下的需求,如下:
poll()方法
如果队列不为空,则出队并返回队头元素,否则返回null。
poll()超时方法
在指定的时间内一直尝试出队,出队成功返回队头元素,否则返回null。
dequeue()方法
take()方法
当队列为空队列时候,阻塞等待队列有元素
remove()方法
contains()方法
clear()方法
更多源码阅读请关注微信公号 Java后端技术栈