并发编程:LinkedBlockingQueue源码浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/o9109003234/article/details/82848528

申明:本文是基于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后端技术栈

猜你喜欢

转载自blog.csdn.net/o9109003234/article/details/82848528