0 0

ConcurrentLinkedQueue中的offer方法如何实现尾指针指向新结点的?5

 
/**
     * Inserts the specified element at the tail of this queue.
     * As the queue is unbounded, this method will never return {@code false}.
     *
     * @return {@code true} (as specified by {@link Queue#offer})
     * @throws NullPointerException if the specified element is null
     */
    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) {
                // p is last node
                if (p.casNext(null, newNode)) {//1
                    // Successful CAS is the linearization point
                    // for e to become an element of this queue,
                    // and for newNode to become "live".
                    if (p != t) // hop two nodes at a time//2
                        casTail(t, newNode);  // Failure is OK.
                    return true;
                }
                // Lost CAS race to another thread; re-read next
            }
            else if (p == q)
                // We have fallen off list.  If tail is unchanged, it
                // will also be off-list, in which case we need to
                // jump to head, from which all live nodes are always
                // reachable.  Else the new tail is a better bet.
                p = (t != (t = tail)) ? t : head;
            else
                // Check for tail updates after two hops.
                p = (p != t && t != (t = tail)) ? t : q;
        }
    }

如上代码所示,1处已经将新结点加到了队列尾部,不管2处的代码是否执行,该方法都将返回true。如果在这个时候p==t或者尾t已经改变,那么casTail(t, newNode);将不会执行,也就是tail并没有指向新结点,请问在这种情况下,casTail(t, newNode)会在什么时候执行?
2012年4月20日 09:17
目前还没有答案

相关推荐

    ConcurrentLinkedQueue源码分析.rar

    在`add()`方法中,新节点会尝试插入到链表的尾部;而在`poll()`方法中,头部节点被移除并返回其值。 `ConcurrentLinkedQueue`的查找操作并不是线性的,而是通过“跳跃”实现的。队首和队尾的查找通常只需要几次迭代...

    顺序栈通常使用数组来实现,其特点是在栈底预先分配好一块存储空间,栈顶指针指向栈顶元素 以下是一个简单的Java实现:.txt

    在这个实现中,类中定义了一个Object数组`stack`来存储栈元素,一个整型变量`top`作为栈顶指针,以及一个整型变量`maxSize`表示栈的最大容量。类的构造函数接收一个整型参数来初始化栈的最大容量。 具体的方法实现...

    LinkedBlockingQueue 和 ConcurrentLinkedQueue的区别.docx

    LinkedBlockingQueue和ConcurrentLinkedQueue是Java并发包中两个常用的线程安全队列,它们各有特点,适用于不同的场景。本文将深入探讨两者之间的差异以及如何根据需求选择合适的队列。 首先,LinkedBlockingQueue...

    聊聊并发(6)ConcurrentLinkedQueue的

    在`ConcurrentLinkedQueue`中,插入元素(`offer()`方法)和移除元素(`poll()`方法)的过程非常高效。插入时,新节点会通过CAS操作添加到链表的尾部;移除时,从头部找到并删除第一个元素,然后更新头部。由于这些...

    ConcurrentLinkedQueue

    ConcurrentLinkedQueue

    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能的线程安全队列实现,基于链表结构,它适用于对吞吐量有较高要求的场景。`ConcurrentLinkedQueue` 不提供容量限制,并且在队列为空...

    自己动手让springboot异步处理浏览器发送的请求(只需要使用ConcurrentLinkedQueue即可)

    在上述代码中,`enqueueTask`方法用于添加任务到`ConcurrentLinkedQueue`,而`processQueue`方法则定期检查并处理队列中的任务,这通过`@Scheduled`注解实现定时任务。这样,当浏览器发送请求时,我们可以将任务放入...

    Java 线程 ? ConcurrentLinkedQueue

    ConcurrentLinkedQueue  在考虑并发的时候可以先考虑单线程的情况,然后再将并发的情况考虑进来。  比如ConcurrentLinkedQueue:  1、先考虑单线的offer  2、再考虑多线程时候的offer:  · 多个线程offer...

    Java 多线程与并发(15-26)-JUC集合- ConcurrentLinkedQueue详解.pdf

    `ConcurrentLinkedQueue`的核心是内部类`Node`,该类负责存储队列中的元素以及指向下一个节点的引用。 ```java private static class Node&lt;E&gt; { // 元素 volatile E item; // next域 volatile Node&lt;E&gt; next; ...

    Java concurrency集合之ConcurrentLinkedQueue_动力节点Java学院整理

    每个队列元素都封装在一个`Node`类中,`Node`包含一个`volatile`类型的`item`字段,用于存储元素,以及一个`volatile`类型的`next`字段,指向下一个节点。`volatile`关键字在这里的作用是确保多线程环境中的内存可见...

    高效的实现队列

    链表提供更灵活的动态扩展性,每个节点包含元素值和指向下一个节点的指针。链表的头部是队头,尾部是队尾。出队只需改变头部指针,入队则在尾部添加新节点。这种方法不会受限于固定大小,但插入和删除操作需要遍历...

    头插法之循环引用问题及解决

    - **在复杂的链表操作(如合并、排序等)中,调整节点关系时未能正确处理指针**,例如,在实现链表的合并功能时,如果未正确处理最后一个节点的`next`指针,可能会导致最后一个节点的`next`指针指向了链表中的某个...

    如何限流?在工作中是怎么做的?说一下具体的实现?java实现

    "限流控制的实现方法" 限流是一种服务降级机制,旨在限制系统的输入和输出流量,以达到保护系统的目的。下面将详细介绍限流的概念、实现方法和Java实现。 什么是限流 限流是服务降级的一种,旨在限制系统的输入和...

    JAVA高并发包介绍

    数据结构上,ConcurrentSkipListMap由一个节点构成,每个节点包含一个键值对以及指向下一个更高层级节点的指针。在多线程环境下,ConcurrentSkipListMap通过锁分割技术来减少锁的竞争,实现更高效的并发访问。 ...

    Java最新面试题及答案.rar

    2. AOP(面向切面编程)的概念,如何在Spring中实现AOP? 3. Spring MVC的工作流程,以及它与Spring框架的关系。 4. Spring Boot的自动配置原理是什么?如何自定义自动配置? 通过学习和掌握这些Java知识点,并结合...

    Java数据结构实现之Stack.zip

    在多线程环境中,可以考虑使用ConcurrentLinkedQueue或ArrayDeque来实现栈。 3. **栈的应用** 栈在编程中有很多实际应用,如: - **函数调用**:Java的JVM在处理方法调用时,使用了运行时栈帧来存储局部变量、...

    无锁队列

    在`ConcurrentLinkedQueue`中,插入操作(offer)和删除操作(poll)的实现如下: 1. **插入操作**(offer): - 新建一个节点,持有待插入的元素。 - 使用CAS操作将新节点设置为当前尾节点的后继节点。如果成功...

    基于Java的对象模型消息机制实现

    这导致了在面向对象建模中实现消息机制较为不便。本文介绍了一种基于Java的面向对象消息机制的实现方法,该方法主要利用了Java中的接口、继承和多态等特性来构建。通过这种方式,可以创建一种类似于微软基础类库...

    Java版链表模板类

    在循环链表中,最后一个节点的指针会指向头节点,形成循环。 2. **模板类设计**: 模板类是一种泛型设计,允许在创建链表实例时指定元素类型。使用`&lt;T&gt;`作为类型参数,可以创建存储任何对象的链表。这样做的好处是...

    java 队列实现

    如果你想要在Eclipse中实现带有AWT组件的队列,可能需要结合Swing(AWT的继承和扩展)来创建一个可视化应用,展示队列的插入和删除操作。例如,你可以创建一个按钮来执行添加元素到队列的操作,另一个按钮来移除队列...

Global site tag (gtag.js) - Google Analytics