我还不明白DataProvider instance = sInstance;在下面的方法中的作用是什么。有没有人帮我详细解释一下?为什么不直接使用sInstance?
private static volatile DataProvider sInstance = null;
public static DataProvider getInstance() {
DataProvider instance = sInstance;
if (instance == null) {
synchronized (DataProvider.class) {
instance = sInstance;
if (instance == null) {
instance = sInstance = new DataProvider();
}
}
}
return instance;
}
发布于 2018-05-29 12:13:11
它被用作惰性初始化(即,仅在需要时创建单例实例)。这段代码的问题在于它被破坏了。显然,即使在使用synchronize块时,也有可能出现错误(由于竞态条件)。所以,如果你想安全,就不要使用这个方法!
替代方案:使用直接赋值(就像你建议的那样);
private static volatile DataProvider sInstance = new DataProvider();
或者使用枚举(由@MadProgrammer建议);
public enum DataProvider
{
INSTANCE;
// singleton content
}
发布于 2018-06-01 17:52:22
主要原因是不稳定。正如@Hien Nguyen的回答,它提高了25%的性能。因为易失性总是从主内存而不是缓存中获取数据,所以它太慢了。声明instance = sInstance以避免多次从主存读取数据(慢)。如果我们不使用temp变量,我们会从sInstance读取数据3次,所以我们使用temp变量会提高性能。
请参阅本主题以了解访问易失性速度缓慢的原因:Why access volatile variable is about 100 slower than member?
您的答案可能与本主题相同:Java: using a local variable in double check idiom
https://stackoverflow.com/questions/50575911
复制相似问题