当前位置: 首页 > 面试题库 >

ConcurrentLinkedQueue代码说明

花健
2023-03-14
问题内容

http://www.java2s.com/Open-Source/Java-Open-Source-
Library/7-JDK/java/java/util/concurrent/ConcurrentLinkedQueue.java.htm

上面是ConcurrentLinkedQueue的源代码。我无法理解一种情况。

条件 (p == q) 如何出现在offer方法的以下代码片段中

  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)) {
                    // 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
                        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;
        }
    }

还有作者的意思是“我们已经从名单上消失了”


问题答案:

ConcurrentLinkedQueue允许在遍历它的内部列表的并发修改。这意味着您正在查看的节点可能已被同时删除。为了检测这种情况,将已删除节点的下一个指针更改为指向其自身。看看updateHead(L302)了解详细信息。



 类似资料:
  • public static final int ERROR_CODE_SUCCESS = -1; public static final int ERROR_CODE_INTERNAL_ERROR = 0; public static final int ERROR_CODE_INVALID_REQUEST = 1; public static final int ERROR_CODE_NETWO

  • 问题内容: 在使用队列在生产者线程和使用者线程之间进行通信的情况下,人们通常会建议使用或吗? 与另一种相比,使用一种有什么优点/缺点? 从API角度看,我的主要区别是a 可以有选择地限制。 问题答案: 对于生产者/消费者线程,我不确定这是否是一个合理的选择- 它没有实现,这是生产者/消费者队列IMO的基本接口。您必须打电话,如果您什么都没找到,请稍等,然后再次轮询等…导致新项目进入时出现延迟,而新

  • 添加多说 在Django1.5版本前是有内置的评论系统的, 不过现在已经放弃使用了, 在国内比较常用的是多说, 在国外是disqus, 因为文章主要面对 国内用户, 所以采用多说 在网站上注册账号或者直接用社交账号进行登录,并会生成一个short_name, 可以在个人界面中的工具中找到一段通用代码, 这段代码非常重要, 用于多说评论框的代码段: <!-- 多说评论框 start -->

  • 问题内容: 我的代码是: 输出: 请向我解释一下,由于该方法已被覆盖,为什么这个问题的输出是“ b 3”而不是“ b 13”? 问题答案: 您无法在Java中覆盖变量,因此实际上您有两个变量-一in 和in in 。在另一方面的方法是多态的,因而它修改(被调用时,尽管静态类型的存在)。 但最终你访问这个参考使用已知类型的编译过程中解决了,这是。因此从未被感动。 Java中的BTW非最终变量 绝对

  • 问题内容: 如何在Java中使用? 使用此方法,我是否需要担心队列中的并发性?还是只需要定义两种方法(一种方法是从列表中检索元素,另一种方法是将元素添加到列表中)? 注意:显然,这两种方法必须同步。对? 编辑: 我想做的是:我有一类(在Java中),其中一种方法可从队列中检索项目,而另一类具有一种方法可将项目添加至队列。从列表中添加和检索的项目是我自己类的对象。 另一个问题:我需要在remove方

  • 问题内容: 我一直使用类似的接口,通过collection.sort为我的班级提供自然的排序。 基本上,如果我有一个person类,我将获得它来实现Comparable接口并提供compareTo的实现。但是在javadocs中Collections.sort的定义中,我看到了这个签名 我根本不了解这个泛型定义?不应该说 有人可以帮我弄这个吗? 问题答案: 其实,这表示T 可以 实现,而不仅仅是。