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

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

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

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

但是上下文是

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

线索是,

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

考虑不带“别名”的代码

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分配
    null
    in
  4. 线程A执行
    return in
    null
    之所以返回,
    a
    是因为
    volatile

“别名”可以防止这种情况。现在

in
,线程A仅读取一次。如果线程B
null
在线程A之后分配
in
,则没有关系。线程A将抛出异常或返回(保证的)非空值。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5132237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存