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

在使用引用之前将引用复制到本地变量是否重要

邓鸿彩
2023-03-14
问题内容

浏览OpenJDK
8中的java.util.LinkedList代码,发现以下代码。该代码很简单,但是我对将对第一个节点的引用保存到第二行代码中的常量感到困惑。据我了解,此代码将内联到单行代码中,而无需引用复制。我对吗?如果是这样,
为什么在这种情况和类似情况下需要复制引用 (这种习语可能在java.util.LinkedList的一半方法中找到)?

public E peek() {
    final Node<E> f = first;
    return (f == null) ? null : f.item;
}

我的第一个想法是,它以某种方式有助于并发,但是LinkedList不允许并发访问(除非您自担风险),因此我想这是优化程序的一些提示,但无法弄清楚它应该如何工作。


问题答案:

我首先想到的是它以某种方式帮助并发…

…所以我想这是优化程序的一些提示…

都。:-) LinkedList不支持并发的事实并不意味着作者无论如何都不会遵循良好实践,并且告诉编译器和JIT他们只应该查找first 一次

没有f局部变量,我们将有:

public E peek() {
    return (this.first == null) ? null : this.first.item;
}

我已经html" target="_blank">添加了一个暗示,this.以强调这first是一个实例字段。

因此,如果this.first == null零件在线程A上进行评估,然后this.first在线程B
this.first.item上进行更改,则在线程A
上进行评估时,它可能会因为在此期间this.first变成而抛出null。使用f,这是不可能的,因为它f是本地的;只有运行peek调用的线程才能看到它。

final部分既是优秀的代码文档(因为作者从不打算更改的值f),也向优化器暗示了我们永远都不会改变f,这意味着当需要进行优化时,它可以对其进行优化。知道它只需要读this.first
一次 ,然后就可以使用寄存器或堆栈值进行null校验和返回,直到其寿命只有一英寸。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 从父函数分配给变量:“分配前引用的局部变量” [重复] (5个答案) Python 3:UnboundLocalError:分配前被引用的局部变量[重复] (5个答案) 10个月前关闭。 我收到以下错误: UnboundLocalError:分配前已引用局部变量“ test1”。 错误说那是局部变量,但我认为这个变量是全局变量 那么它是全局的还是局部的,

  • 如果我这样做会发生什么: 它是从内存中删除对象,还是只清除引用? 更正式地说,考虑守则: 为什么仍然不是?它不应该被从记忆中删除吗?

  • 问题内容: PHP中是否有一种方法可以确定给定变量是否是对另一个变量的引用和/或被另一个变量引用?考虑到php.net上的注释,设置可能意味着“ $ a和$ b在这里完全相等。 我可能会无法分开检测“对……的引用”和“对……的引用” 。$ a并不指向$ b或反之亦然。$ a和$ b指向同一位置。 ” 如果无法确定给定变量是否是引用/引用,是否存在一种通用方法来确定两个变量是否是彼此引用?再次,对p

  • 问题内容: 我在这里写了一个快速的jsfiddle,其中我将一个小的JSON对象传递给一个新变量,并修改了原始变量(而不是新变量)中的数据,但是新变量的数据也得到了更新。这必须意味着JSON对象是通过引用传递的,对吗? 这是我的快速代码: 有没有一种方法可以对JSON对象进行深层复制,以便修改原始变量不会修改新变量? 问题答案: 我发现,如果您不使用jQuery而仅对克隆 简单对象 感兴趣(请参见

  • 问题内容: 但我在编译代码时遇到此错误: 异常类型:UnboundLocalError 异常值:分配前已引用本地变量“服务器” 异常位置:/ home / amine / PFE目录/ websvc中的mysite1 / myform / Webservice.py,第43行Python可执行文件:/usr/bin/python2.7 我在此函数中添加参数之前,此代码正常工作 问题答案: 您的代码

  • 我试图从类内部引用公共变量。 但这会返回一个解析错误: 正确的做法是什么?