在Singleton中如何进行延迟初始化?

时间:2014-12-08 09:45:08

标签: java lazy-initialization

任何人都可以解释在以下单例模式代码中如何进行延迟初始化?

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

3 个答案:

答案 0 :(得分:7)

第一次调用getInstance()时,INSTANCE为空,并使用INSTANCE = new Singleton();进行初始化。如果从未使用它,则具有不初始化实例的优点。

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

答案 1 :(得分:1)

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

这是一个渴望的例子,它在使用之前已初始化。

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

答案 2 :(得分:1)

初始化类时,实例仅创建 ,只有在调用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)中执行。