使用本地变量的单例java安全发布
在浏览这个article时,我遇到了下面的代码,它解释了安全发布字段
public class SafeLocalDCLFactory implements Factory {
private volatile Singleton instance;
@Override
public Singleton getInstance() {
Singleton res = instance;
if (res == null) {
synchronized (this) {
res = instance;
if (res == null) {
res = new Singleton();
instance = res;
}
}
}
return res;
}
}
我的疑问是,为什么我们需要在getInstance()
中定义局部变量res
?难道volatile
和DCL
不足以保证safe publication
?在这里定义一个局部变量res
,然后将其与null
进行比较的目的到底是什么
编辑:本文解释了以下内容,以证明需要使用局部var。但是我们如何保护自己不返回null
The introduction of local variable here is a correctness fix, but only partial: there still no happens-before between publishing the Singleton instance, and reading of any of its fields. We are only protecting ourselves from returning "null" instead of Singleton instance
# 1 楼答案
它最小化了从易失性变量
instance
读取的次数。易失性变量访问比非易失性内存访问更昂贵,因为它通常涉及内存屏障。通过将其分配给临时变量,如果volatile变量已经初始化,则该代码只读取一次,而不是两次(一次用于检查,一次用于返回)