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

将实例字段分配给局部变量

屠瑞
2023-03-14
问题内容

这是JDK的类keySet()方法HashMap。作者为什么将字段分配keySet给局部变量ks

public Set<K> keySet() {
    Set<K> ks;
    return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}

上面和下面之间有什么区别?这与线程安全有关吗?

public Set<K> keySet() {
    return (keySet == null ? (keySet = new KeySet()) : keySet;
}

问题答案:

为了稍微扩展一下Michael的答案,我希望它可以确保该keySet()方法永不返回null,而且还可以提供所提到的性能优势。

给出以下代码:

public Set<K> keySet() {
    return (keySet == null ? (keySet = new KeySet()) : keySet;
}

至少从理论上讲,在多线程代码中,keySet可以将字段设置为null第一次读取(keySet == null)和第二次读取之间,然后将其返回。我没有看过其余的代码,但是我假设还有其他keySet可能被分配的地方null。对于作者来说,这是到底是野外出现的问题还是防御措施。

实际代码:

public Set<K> keySet() {
    Set<K> ks;
    return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}

…没有这个问题,因为该字段只能读取一次。



 类似资料:
  • 问题内容: 我正在阅读的源代码,并发现了一些我不理解的代码: 注意这一行: 为什么不直接使用它,而是将其分配给局部变量? 问题答案: 可能是出于 优化 目的吗? 可能可以通过JIT编译器更轻松地将局部变量直接分配给寄存器。 至少在Android中,对于API的第一个版本,访问局部变量比访问实例变量便宜(不能代表较新的版本)。普通的Java可能是相同的,在某些情况下使用本地是有意义的。 实际上,在这

  • 问题内容: 我正在阅读的来源,发现如果该方法中多次使用该值,则几乎总是将字段分配给局部变量。 由于此类已记录为不是线程安全的,并且字段也不是可变的,所以这有什么意义?它会使代码更有效吗? 问题答案: 通过将成员字段放入本地范围(即当前堆栈框架)中,可以为整个方法执行固定引用。因此,每次使用时,您对同一对象都有相同的引用。 无需将其置于本地范围内,对字段的每次访问均通过引用(隐式或显式)进行。因此,

  • 问题内容: 作为Eclipse的长期用户,我正在与IntelliJ IDEA 10一起玩耍。我似乎找不到如何执行“向新局部变量分配语句”代码完成的工作。 功能说明: 我输入类似 然后按+ 并输入,Eclipse将行更改为: 同时,我可以立即键入“ bufferedOutputStream”以将其重命名(或从下拉菜单中选择“ bufferedOutputStream”,“ outputStream”

  • 问题内容: 浏览Java API源代码时,我经常看到方法参数已重新分配给局部变量。为什么要这样做? 这在java.util.HashMap中 问题答案: 这是线程安全性/更好性能的规则。在易失。如果将变量分配给局部变量,它将变为局部堆栈变量,该变量自动是线程安全的。而且,修改局部堆栈变量不会强制“先发生”,因此在使用它时不会产生同步损失(与之不同的是,每次读/写操作都会导致易失性,这会花费您获取/

  • 本文向大家介绍python函数局部变量用法实例分析,包括了python函数局部变量用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python函数局部变量用法。分享给大家供大家参考。具体分析如下: 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的

  • 问题内容: 假设我有一个功能 现在,我想将函数分配给一个名为的变量,这样,如果我使用,它将再次调用该函数。如果我只是做作业,它就会返回。 问题答案: 您根本不调用该函数。 括号告诉蟒蛇,你调用的函数,所以当你把它们放在那里,它调用的功能,并指定值 返回 的(在这种情况下)。