ConcurrentLinkedDeque

本文深入探讨了Java并发集合ConcurrentLinkedDeque,它是一个线程安全的双端队列,适用于并发环境。文章分析了其内部结构、特点、线程同步机制以及关键操作如`linkFirst`的实现原理,展示了ConcurrentLinkedDeque如何作为队列和栈使用,并指出其在并发操作中的注意事项。
摘要由CSDN通过智能技术生成

本篇文章是【Java集合系列】文章队列篇的第二篇,本系列将会逐个分析 Java 中的常用集合的特性及实现,然后对比不同场景下应该选择哪种集合使用。

List 系列

Queue系列

  • ArrayDeque
  • ConcurrentLinkedDeque
  • LinkedBlockingDeque

ConcurrentLinkedDeque

ConcurrentLinkedDeque 是基于链表无限双端队列线程安全,不允许 null 元素。

ConcurrentLinkedDeque 内部通过 CAS 来实现线程同步,一般来说,如果需要使用线程安全的双端队列,那么推荐使用该类。

由于双端队列的特性,该类同样可以当做来使用,所以如果需要在并发环境下使用栈,也可以使用该类。

迭代器设计为弱一致性的(weakly consistent),此外还可以通过descendingIterator方法获取一个通过相反方向遍历的迭代器。

虽然跟 LinkedList 一样都是双端队列的链表实现,但由于其并发特性,导致无法简单点的通过计数来确定队列的长度,所以size方法将会以线性时间运行,并且如果在执行期间被其它线程修改可能返回不准确的结果

对于批量操作,例如:addAll,removeAll,retainAll,containsAll,equals,toArray来说,不能保证这些操作的原子性。

方法

ConcurrentLinkedDeque 作为队列(FIFO)使用时的方法:

队列方法 等效的双端队列方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

ConcurrentLinkedDeque 作为堆栈(FILO)使用时的方法:

堆栈方法 等效的双端队列方法
push(e) addFirst(e)
pop(e) removeFirst(e)
peek() peekFirst()

源码

因为 ConcurrentLinkedDeque 是基于链表的数据结构,我们先看看该类中使用的链表节点 Node 的相关代码。

Node

static final class Node<E> {
   
    volatile Node<E> prev;
    volatile E item;
    volatile Node<E> next;

    private static final sun.misc.Unsafe UNSAFE;
    private static final long prevOffset;
    private stat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值