文档章节

阻塞队列(2)--LinkedBlockingDeque底层实现

yokol
 yokol
发布于 06/21 22:18
字数 643
阅读 32
收藏 0

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()方法是如果队列为空,其他线程将会阻塞

    

© 著作权归作者所有

共有 人打赏支持
上一篇: CAS、AQS理解
下一篇: 科目二
yokol

yokol

粉丝 5
博文 17
码字总数 26483
作品 0
海淀
个人站长
私信 提问
Java并发--- 简单聊聊JDK中的七大阻塞队列

JDK中除了上文提到的各种并发容器,还提供了丰富的阻塞队列。阻塞队列统一实现了BlockingQueue接口,BlockingQueue接口在java.util包Queue接口的基础上提供了put(e)以及take()两个阻塞方法。...

Ala6
10/26
0
0
【死磕Java并发】-----J.U.C之阻塞队列:LinkedBlockingDeque

原文出处http://cmsblogs.com/ 『chenssy』 前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和...

chenssy
2017/10/03
0
0
【死磕Java并发】—–J.U.C之阻塞队列:LinkedBlockingDeque

原文出处http://cmsblogs.com/ 『chenssy』 前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和...

chenssy
2017/10/03
0
0
JAVA 多线程(集合的多线程)Deque与LinkedBlockingDeque深入分析

一、双向队列Deque Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体...

止静
2014/08/18
0
0
阻塞队列_BlockingQueue

阻塞队列_BlockingQueue 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,...

秋风醉了
2016/06/08
116
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot中filter的用法

一、在spring的应用中我们存在两种过滤的用法,一种是拦截器、另外一种当然是过滤器。我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别。 二、f...

xiaomin0322
25分钟前
4
0
java项目修改了更换了jdk版本报错进行修改

java项目原来用的是1.8版本的,改成1.7版本后,项目会报错,要进行的修改是 然后是clean一下项目,然后是选中项目的buildpath,然后是configurebuildpath,然后是看jdk是否进行修改...

myAll_myAll
37分钟前
4
0
Gartner 2018 数据库系列报告发布 巨杉数据库连续两年入选

近期,Gartner陆续发布了2018年的数据库系列报告,包括《数据库魔力象限》《数据库核心能力》以及《数据库推荐报告》。其中,SequoiaDB巨杉数据库作为业界领先的金融级分布式交易型数据库产品...

巨杉数据库
39分钟前
2
0
Navicat闲置一段时间卡死问题的解决

先关闭连接,再右键点击所需要设置的链接,进入编辑连接,进入高级项,勾选保持连续间隔(秒):时间设置短一些,比如30秒,完成!!

joyStalker
39分钟前
2
0
理解Java中的弱引用(Weak Reference)

1. What——什么是弱引用? Java中的弱引用具体指的是java.lang.ref.WeakReference<T>类,我们首先来看一下官方文档对它做的说明: 弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回...

绝地逢生
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部