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

关于java中的单例模式,与其在方法中将静态变量分配给新的局部变量,为什么不直接使用静态变量呢?,java,design-patterns,Java,Design Patterns,我还不明白代码的用途=>DataProvider instance=sInstance在下面的方法中。有人帮我详细解释一下吗?为什么不直接使用sInstance private static volatile DataProvider sInstance = null; public static DataProvider getInstance() { DataProvider instance = sInstance; if (instance == null) {

我还不明白代码的用途=>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;
  }

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

备选方案: 使用直接赋值(如您所建议的)

或者使用枚举(如@MadProgrammer所建议)


根据Joshua Bloch 2008年5月出版的《Prentice.Hall.Effective.Java.2nd.Edition》一书

特别是,对局部变量结果的需求可能不清楚。 此变量的作用是确保字段在中只读取一次 它已经初始化的常见情况。虽然不严格 必要时,这可能会提高性能,并且通过 应用于低级并发编程的标准。在我的机器上, 上述方法比显而易见的方法快25% 没有局部变量


主要原因是不稳定。正如@Hien Nguyen的回答,它提高了25%的性能。因为Volatile总是从主内存而不是缓存中获取数据,所以速度太慢。Declare instance=sInstance以避免多次(缓慢)从主存读取数据。 如果不使用temp变量,我们有三次从sInstance读取数据,所以使用temp变量将提高性能

请参阅本主题以了解访问速度缓慢的原因:


您的答案可能与本主题相同:

为了获得它的价值,您应该使用
enum
而不是从何处获得代码?它看起来太复杂了,只是一个微观优化@它的代码来自telegram@Radiodef请您详细解释一下:(我不知道为什么在使用=>DataProvider instance=sInstance之前需要分配给局部变量;我想知道为什么我们应该分配给局部变量=>DataProvider instance=sInstance;:(请您给我详细解释一下:(
private static volatile DataProvider sInstance = new DataProvider();
public enum DataProvider
{

    INSTANCE;

    // singleton content
}