技术文章 > java >  java基础 > 正文

java中ConcurrentLinkedQueue的入队

小妮浅浅

作为队列,ConcurrentLinkedQueue同样也有入队的相关操作,当然非阻塞队列和之前的入队方法有一些不同之处。遵循的是先进先出的原则,需要我们对入队的说明、过程有一定的基本了解。在掌握这些内容后,进一步对ConcurrentLinkedQueue入队的实例方法带来相关介绍。

1.入队说明

入队列就是将入队节点添加到队列的尾部。为了方便理解入队时队列的变化,以及head节点和tair节点的变化,每添加一个节点我就做了一个队列的快照图。

2.入队过程

从源代码角度来看整个入队过程主要做二件事情。

(1)定位出尾节点,

(2)使用CAS算法能将入队节点设置成尾节点的next节点,如不成功则重试。

3.入队实例

add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue中,这两个方法没有任何区别)。

/**
 * 入队一个元素.
 *
 * @throws NullPointerException 元素不能为null
 */
public boolean add(E e) {
    return offer(e);
}
 
/**
 * 在队尾入队元素e, 直到成功
 */
public boolean offer(E e) {
    checkNotNull(e);
    final Node<E> newNode = new Node<E>(e);
    for (Node<E> t = tail, p = t; ; ) {             // 自旋, 直到插入结点成功
        Node<E> q = p.next;
        if (q == null) {                            // CASE1: 正常情况下, 新结点直接插入到队尾
            if (p.casNext(null, newNode)) {
                // CAS竞争插入成功
                if (p != t)                         // CAS竞争失败的线程会在下一次自旋中进入该逻辑
                    casTail(t, newNode);            // 重新设置队尾指针tail
                return true;
            }
            // CAS竞争插入失败,则进入下一次自旋
 
        } else if (p == q)                          // CASE2: 发生了出队操作
            p = (t != (t = tail)) ? t : head;
        else
            // 将p重新指向队尾结点
            p = (p != t && t != (t = tail)) ? t : q;
    }
}

以上就是java中ConcurrentLinkedQueue的入队方法,同样是熟悉的offer方法为例带来介绍,同样add也是插入元素的一种方法,这里我们就不再介绍,感兴趣的可以课后了解。

免费视频教程
本文原创发布python学习网,转载请注明出处,感谢您的尊重!
相关文章
 java中linkedblockingqueue用法
 linkedblockingqueue在java中的原理
 java中linkedblockingqueue的增加方法
 linkedblockingqueue在java中出队
 java ConcurrentLinkedQueue是什么
 ConcurrentLinkedQueue在java的原理探究
相关视频章节
 网络爬虫
 云端部署Web应用程序视频
 Web应用框架Flask和文件模板
 Web应用程序开发概述
 继承和多态
作者信息

小妮浅浅

认证0级讲师

最近文章
java编译命令是什么522
java的jdk是什么411
java Wrapper类的使用812
推荐视频
视频教程分类