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

为什么BufferedInputStream将字段复制到局部变量而不是直接使用该字段

佟涵畅
2023-03-14
问题内容

当我从中读取源代码时java.io.BufferedInputStream.getInIfOpen(),我很困惑为什么它编写了这样的代码:

/**
 * Check to make sure that underlying input stream has not been
 * nulled out due to close; if not return it;
 */
private InputStream getInIfOpen() throws IOException {
    InputStream input = in;
    if (input == null)
        throw new IOException("Stream closed");
    return input;
}

为什么使用别名而不是in直接使用field变量,如下所示:

/**
 * Check to make sure that underlying input stream has not been
 * nulled out due to close; if not return it;
 */
private InputStream getInIfOpen() throws IOException {
    if (in == null)
        throw new IOException("Stream closed");
    return in;
}

有人可以给出合理的解释吗?


问题答案:

如果您是从上下文中看这段代码,那么对于“别名”将没有很好的解释。它仅仅是冗余代码或不良的代码样式。

但是上下文是BufferedInputStream可以被子类化的类,它需要在多线程上下文中工作。

线索是,in在宣布FilterInputStreamIS protected volatile。这意味着子类有可能进入并分配nullin。考虑到这种可能性,实际上会使用“别名”来防止出现竞争状况。

考虑不带“别名”的代码

private InputStream getInIfOpen() throws IOException {
    if (in == null)
        throw new IOException("Stream closed");
    return in;
}
  1. 线程A调用 getInIfOpen()
  2. 线程A评估in == null得出in的结果不是null
  3. 线程B分配nullin
  4. 线程A执行return innull之所以返回,a是因为volatile

“别名”可以防止这种情况。现在in线程A仅读取一次。如果线程B
null在线程A之后分配in,则没有关系。线程A将抛出异常或返回(保证的)非空值。



 类似资料:
  • 当我从,我不明白它为什么会这样写代码: 为什么它使用别名,而不是直接在中使用字段变量

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

  • 如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?

  • :我知道如何: 运行不带参数的私有void方法 :我知道如何: 设置任意类型的私有字段 设置任意类型的私有静态字段 设置任意类型的私有最终字段 设置任意类型的私有静态最终字段 :我知道如何: 获取任何类型的私有字段 :我知道如何: (可用于以单模式创建私有构造函数的新实例,同时保持实例Field为空) 创建不带参数的私有构造函数的新实例 我不知道的,我想知道的: 获取任何类型的私有静态字段,并将其

  • 本地风险值背后的想法是最终的,而领域不是。

  • 我看到了这种奇怪的行为,我想知道是否有合理的解释: 当我(意外地)在函数的局部变量中添加了一个额外的分号时,如: 它确实可以编译,但它表明它是多余的。 但当我对字段执行此操作时(也是偶然),我得到了一个错误(编译): 问题 是否有任何理由限制这些领域? Nb我已经知道了不允许带有字段的另一个限制因素。但这里有所不同。