首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关于java中的单例模式,与其在方法中将静态变量赋给新的局部变量,为什么不直接使用静态变量呢?

关于java中的单例模式,与其在方法中将静态变量赋给新的局部变量,为什么不直接使用静态变量呢?
EN

Stack Overflow用户
提问于 2018-05-29 11:28:49
回答 2查看 188关注 0票数 1

我还不明白DataProvider instance = sInstance;在下面的方法中的作用是什么。有没有人帮我详细解释一下?为什么不直接使用sInstance?

代码语言:javascript
复制
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;
  }
EN

回答 2

Stack Overflow用户

发布于 2018-05-29 12:13:11

它被用作惰性初始化(即,仅在需要时创建单例实例)。这段代码的问题在于它被破坏了。显然,即使在使用synchronize块时,也有可能出现错误(由于竞态条件)。所以,如果你想安全,就不要使用这个方法!

替代方案:使用直接赋值(就像你建议的那样);

代码语言:javascript
复制
private static volatile DataProvider sInstance = new DataProvider();

或者使用枚举(由@MadProgrammer建议);

代码语言:javascript
复制
public enum DataProvider
{

    INSTANCE;

    // singleton content
}
票数 1
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50575911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档