• 技术文章 >java >java基础

    java中ConcurrentLinkedQueue的入队

    小妮浅浅小妮浅浅2021-02-09 13:56:25原创2684

    本文教程操作环境:windows7系统、jquery3.2.1版本,DELL G3电脑。

    1.入队说明

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

    2.入队过程

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

    (1)定位出尾节点,

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

    3.入队实例

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    /**

     * 入队一个元素.

     *

     * @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也是插入元素的一种方法,这里我们就不再介绍,感兴趣的可以课后了解。

    专题推荐:java,concurrentlinkedqueue入队
    上一篇:ConcurrentLinkedQueue在java的原理探究 下一篇:java中SynchronousQueue是什么意思

    相关文章推荐

    • python中的upper是啥意思• java中linkedblockingqueue用法• linkedblockingqueue在java中的原理• java中linkedblockingqueue的增加方法• linkedblockingqueue在java中出队• java ConcurrentLinkedQueue是什么• ConcurrentLinkedQueue在java的原理探究• jquery遍历find()方法如何使用• python有几种可视化图形库?• python中如何使用np.delete()方法?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网