文档章节

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

yokol
 yokol
发布于 06/21 22:18
字数 643
阅读 23
收藏 0
点赞 0
评论 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()方法是如果队列为空,其他线程将会阻塞

    

© 著作权归作者所有

共有 人打赏支持
yokol

yokol

粉丝 3
博文 17
码字总数 26483
作品 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
Java并发学习(二十三)-LinkedBlockingQueue和LinkedBlockingDeque分析

有两个比较相似的并发阻塞队列,LinkedBlockingQueue和LinkedBlockingDeque,两个都是队列,只不过前者只能一端出一端入,后者则可以两端同时出入,并且都是结构改变线程安全的队列。其实两个...

anLA_
01/10
0
0
【死磕Java并发】-----J.U.C之阻塞队列:BlockingQueue总结

原文出处http://cmsblogs.com/ 『chenssy』 经过前面六篇博客的阐述,我想各位应该对阻塞队列BlockingQueue有了较为深入的理解,下面来一个总结,先看整个类图: BlockingQueue BlockingQueu...

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

原文出处http://cmsblogs.com/ 『chenssy』 经过前面六篇博客的阐述,我想各位应该对阻塞队列BlockingQueue有了较为深入的理解,下面来一个总结,先看整个类图: BlockingQueue BlockingQueu...

chenssy
2017/10/04
0
0
并发容器与框架——并发容器(二)

1.何为阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法:意思是当队列满(无界队列除外)时,队列会阻塞...

江左煤郎
05/06
0
0
Java并发编程之JUC容器概述

今天开始学习JUC容器。JUC提供了用于多线程上下文中的Collection实现与高效的、可伸缩的、线程安全的非阻塞FIFO队列。参考JDK1.8,画出下图。 List JUC容器中List的实现只有CopyOnWriteArra...

潘威威的博客
2017/12/21
0
0
图学java基础篇之集合

(本文部分图片引用自其他博客,最后有链接,侵删。由于笔记使用markdown记录,格式可能不是太好看,见谅) 红字为java.util包下的,绿字为concurrent包下扩展的与并发相关的类 功能:有序非...

oO脾气不坏Oo
2015/10/24
136
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
15分钟前
0
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
16分钟前
0
0
Kafka相关使用

安装前提,需要有jdk环境,还有zookeeper环境 zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper安装参考:https://www.jianshu.com/p/f7037105db46 kafka的下......

朝如青丝暮成雪
17分钟前
0
0
CentOS7 解决无法使用tab自动补全 tab代码提示

一、前言 对于刚刚开始学习linux的新人来说,linux的一切都显着神秘,只能惊叹于大牛在Linux上行云流水的操作。今天介绍一下在linux中自动补全的功能。 对于新人来说,在不懂得技巧的情况下,...

ziluopao
23分钟前
0
0
redis安装

https://www.cnblogs.com/feijl/p/6879929.html

ghou-靠墙哭
23分钟前
0
0
Spring核心——注解自动装载

从配置上扩展 之前的文章介绍了Spring的IoC容器配置管理方面的详细内容,需要了解的可以从IoC容器的设计模式开始阅读。在介绍基于注解配置的配置之前我们再重复一下在之前提到的基本认识: ...

随风溜达的向日葵
26分钟前
2
0
ElasticSearch学习(8)—— SearchType

Elasticsearch有四种类型的SearchType 1、query and fetch 向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最...

叶枫啦啦
27分钟前
0
0
MYSQL备份工具-mysqldump

介绍 mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象。它也有 insert 语句来使用数据构成表。 语法 mysqldump 的语法是...

郭恩洲_OSC博客
29分钟前
0
0
我的第一个go web框架

使用了beego等go web开发框架之后,感觉各种不方便,尤其是在接收参数、和自定义输出的时候,各种难受,定义各种model,这不是找事情嘛??尤其是在角色权限控制的时候我也感觉力不从心。。。...

独坐苔痕但观罗敷
30分钟前
0
0
自动代码生成图形化工具

自动生成Spring代码 https://github.com/EliMirren/Spring-generator 自动生成Vertx https://gitee.com/duhua/vertx-generator...

奋斗的小牛
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部