如果您是从上下文中看这段代码,那么对于“别名”将没有很好的解释。它仅仅是冗余代码或不良的代码样式。
但是上下文是
BufferedInputStream可以被子类化的类,它需要在多线程上下文中工作。
线索是,
in在宣布
FilterInputStreamIS
protectedvolatile。这意味着子类有可能进入并分配
null给
in。考虑到这种可能性,实际上会使用“别名”来防止出现竞争状况。
考虑不带“别名”的代码
private InputStream getInIfOpen() throws IOException { if (in == null) throw new IOException("Stream closed"); return in;}
- 线程A调用
getInIfOpen()
- 线程A评估
in == null
得出in
的结果不是null
。 - 线程B分配
null
给in
。 - 线程A执行
return in
。null
之所以返回,a
是因为volatile
。
“别名”可以防止这种情况。现在
in,线程A仅读取一次。如果线程B
null在线程A之后分配
in,则没有关系。线程A将抛出异常或返回(保证的)非空值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)