并发集合8-LinkedBlockingDeque源码分析

前言

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

定义


并发集合8-LinkedBlockingDeque源码分析_第1张图片

实现了BlockingDeque接口

重要字段

双向链表节点

并发集合8-LinkedBlockingDeque源码分析_第2张图片

first和last节点在初始化时同时为null。
并发集合8-LinkedBlockingDeque源码分析_第3张图片

first和last节点状态相对于ConcurrentLinkedDeque的比较简单,因为 此first和last节点都为普通变量,并不会因为频繁的读写(相对于volatile变量)造成性能瓶颈
并发集合8-LinkedBlockingDeque源码分析_第4张图片

count:元素数量计数
capacity:队列最大容量
并发集合8-LinkedBlockingDeque源码分析_第5张图片

一个ReentrantLock锁,两个Condition。

构造器

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



指定大于0的容量


并发集合8-LinkedBlockingDeque源码分析_第6张图片

集合构造器,默认容量Integer.MAX_VALUE,加锁,保证普通变量刷新到主内存中,保证其线程可见性。
并发集合8-LinkedBlockingDeque源码分析_第7张图片

offerFirst方法(不响应中断)

并发集合8-LinkedBlockingDeque源码分析_第8张图片

并发集合8-LinkedBlockingDeque源码分析_第9张图片

offerLast方法(不响应中断)

并发集合8-LinkedBlockingDeque源码分析_第10张图片

并发集合8-LinkedBlockingDeque源码分析_第11张图片

putFirst方法(响应中断)

并发集合8-LinkedBlockingDeque源码分析_第12张图片

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

putLast(响应中断)

并发集合8-LinkedBlockingDeque源码分析_第13张图片

offerFirst (响应中断超时)

并发集合8-LinkedBlockingDeque源码分析_第14张图片

offerLast(响应中断超时)

并发集合8-LinkedBlockingDeque源码分析_第15张图片

pollFirst(不响应中断)

并发集合8-LinkedBlockingDeque源码分析_第16张图片

并发集合8-LinkedBlockingDeque源码分析_第17张图片

pollLast(不响应中断)

并发集合8-LinkedBlockingDeque源码分析_第18张图片

并发集合8-LinkedBlockingDeque源码分析_第19张图片

remove方法

并发集合8-LinkedBlockingDeque源码分析_第20张图片

并发集合8-LinkedBlockingDeque源码分析_第21张图片

并发集合8-LinkedBlockingDeque源码分析_第22张图片

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

contains方法

并发集合8-LinkedBlockingDeque源码分析_第23张图片

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

size方法

并发集合8-LinkedBlockingDeque源码分析_第24张图片

时间复杂度为O(1)

iterator迭代器

并发集合8-LinkedBlockingDeque源码分析_第25张图片

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

方法列表

并发集合8-LinkedBlockingDeque源码分析_第26张图片

并发集合8-LinkedBlockingDeque源码分析_第27张图片
并发集合8-LinkedBlockingDeque源码分析_第28张图片

总结

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

你可能感兴趣的:(并发集合8-LinkedBlockingDeque源码分析)