并发集合8-LinkedBlockingDeque源码分析

前言

LinkedBlockingDeque是基于双向链表的双端有界阻塞队列,使用非公平ReentrantLock实现线程安全,默认和最大长度都为Integer.MAX_VALUE;不允许null元素添加;实现骨架和ConcurrentLinkedDeque一样,只是对并发控制的细节不同(volatile+循环CAS),双端队列可以用来实现 "窃取算法" ,两头都可以操作队列,相对于单端队列可以减少一半的竞争

定义


实现了BlockingDeque接口

重要字段

双向链表节点


first和last节点在初始化时同时为null。

first和last节点状态相对于ConcurrentLinkedDeque的比较简单,因为此first和last节点都为普通变量,并不会因为频繁的读写(相对于volatile变量)造成性能瓶颈

count:元素数量计数
capacity:队列最大容量

一个ReentrantLock锁,两个Condition。

构造器

无参构造器,默认容量Integer.MAX_VALUE



指定大于0的容量



集合构造器,默认容量Integer.MAX_VALUE,加锁,保证普通变量刷新到主内存中,保证其线程可见性。

offerFirst方法(不响应中断)


offerLast方法(不响应中断)


putFirst方法(响应中断)


如果已经满了,则等待直到队列不满

putLast(响应中断)

offerFirst (响应中断超时)

offerLast(响应中断超时)

pollFirst(不响应中断)


pollLast(不响应中断)


remove方法




两个方法分别遍历队列头尾遍历数组,时间复杂度为O(n)

contains方法


两个方法分别遍历队列头尾遍历数组,时间复杂度为O(n)

size方法


时间复杂度为O(1)

iterator迭代器


迭代器都是弱一致性的,在操作队列元素时需要加锁,但是在迭代操作之间,队列有可能被其他线程修改,当hasNext返回true,但是下一次next和remove方法元素已经被删除了,此时将抛出NoSuchElementException异常

方法列表


总结

LinkedBlockingDeque性能基本和LinkedBlockingQueue一致,只是双端队列和单端队列的区别,一把锁和两把锁的区别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,292评论 0 16
  • 前言 有界并发阻塞队列,基于单向链表的实现,按照FIFO对元素进行操作,默认和最大长度都为Integer.MAX_...
    zhanglbjames阅读 1,037评论 1 1
  • 相关文章Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步Java并发编程(三)volatil...
    刘望舒阅读 5,255评论 1 31
  • 世间的每一个人都是一个独立的个体,我们有着自己的事情和想法,不管我们的人生是成功还是失败都跟他人没有关系,相反的别...
    阿狸G阅读 524评论 0 2