文档章节

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

yokol
 yokol
发布于 06/21 22:18
字数 643
阅读 28
收藏 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

粉丝 4
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
16分钟前
0
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
20分钟前
0
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
21分钟前
0
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
28分钟前
0
0
使用xtrabackup完成远程备份

转载收藏,以防丢失 需求 Can I backup remote databases from my local server02-27-2013, 06:17 AMHi, I am using mysqldump so far for taking daily backups of my Production datab......

阿dai
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部