【问题标题】:How does lazy initialization happen in Singleton?Singleton 中的延迟初始化是如何发生的?
【发布时间】:2014-12-08 09:45:07
【问题描述】:

谁能解释下面的单例模式代码中延迟初始化是如何发生的?

public class Singleton 
{ 
  private static Singleton INSTANCE = null; 
  private Singleton() {} 
  public static Singleton getInstance() 
  { 
    if (INSTANCE == null) 
       INSTANCE = new Singleton(); 
    return INSTANCE; 
  } 
}

【问题讨论】:

标签: java lazy-initialization


【解决方案1】:

第一次调用getInstance()INSTANCE为空,初始化为INSTANCE = new Singleton();。这样做的好处是,如果从不使用实例,则不会对其进行初始化。

如果该代码可以被多个线程访问,则应将其改进为线程安全的。

【讨论】:

  • public enum Singleton { INSTANCE; public void method() { ... } } 这是制作线程安全单例的最佳方法(Thx Joshua Bloch)
【解决方案2】:

实例在类初始化时被创建,类只有在你调用getInstance时才被初始化。

您可能想访问JLS - 12.4.1. When Initialization Occurs

一个类或接口类型 T 将在 以下任何一项的第一次出现:

T 是一个类,并创建了一个 T 的实例。

T是一个类,调用了T声明的静态方法。

分配了一个由 T 声明的静态字段。

使用了由 T 声明的静态字段,并且该字段不是常量 变量(第 4.12.4 节)。

T 是顶级类(第 7.6 节)和断言语句(第 14.10 节) 执行词法嵌套在 T(第 8.1.3 节)中。

【讨论】:

    【解决方案3】:

    Lazy 表示实例在第一次使用时就被初始化。

    这里是一个 Eager 的例子,它在使用之前被初始化。

    public class Singleton 
    { 
      private static Singleton INSTANCE = new Singleton(); 
      private Singleton() {} 
      public static Singleton getInstance() 
      { 
        return INSTANCE; 
      } 
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多