并发集合8-LinkedBlockingDeque源码分析

2017-06-23  本文已影响0人  zhanglbjames

前言

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一致,只是双端队列和单端队列的区别,一把锁和两把锁的区别。

上一篇下一篇

猜你喜欢

热点阅读