1

這是正確的:擁有或不擁有單身人士=懶惰與渴望初始化?

  • 使用singleton with a holder給人慵懶的初始化,因爲當運行Singleton.getInstance()SingletonHolder只初始化。這依賴於SingletonHolder只有在Singleton.getInstance()內引用。它是線程安全的,因爲類加載器負責同步。
  • 使用沒有持有人單身渴望初始化,因爲一旦如Java遇到代碼引用Singleton,其所有的靜態字段都解決了。它也是線程安全的,因爲類加載器負責同步。

辛格爾頓有支架。

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

沒有持有人的單身人士。

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

響應@揚的建議,認爲這是What is an efficient way to implement a singleton pattern in Java?重複更新。我不同意。我不是在問最好的方法是什麼:我只是問是什麼讓這兩個特定的實現是懶惰還是急於加載。像xyz's這樣的答案廣泛地解決了懶惰和渴望的問題,但並不是通過對比我試圖研究的兩個例子(或者使用相同的關鍵詞,這是爲什麼它從未在我的初始搜索中出現)。

+1

是的,這是正確的。 –

+0

有多種方式來實現單身人士,lazy/eager取決於你的實現。 http://stackoverflow.com/a/16580366/705773可能會有所幫助。 – xyz

+0

[在Java中實現單例模式的有效方法是什麼?](http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton- pattern-in-java) – Jan

回答

1

針對@Sriram,這裏是我的測試,以證明這是渴望VS延遲加載。

延遲加載有支架

public class Singleton { 
    private static class SingletonHolder { 
     static { 
     System.out.println("In SingletonHolder static block."); 
     } 
     private static final Singleton INSTANCE = new Singleton(); 
    } 

    public static Singleton getInstance() { 
     System.out.println("In getInstance()."); 
     return SingletonHolder.INSTANCE; 
    } 

    private Singleton() { 
     System.out.println("In constructor."); 
    } 

    private void doSomething() { 
     System.out.println("Singleton working."); 
    } 

    public static void main(String[] args) { 
     System.out.println("Start of main."); 
     Singleton.getInstance().doSomething(); 
     System.out.println("End of main."); 
    } 
} 

的輸出顯示main方法開始之前getInstance()被調用,因而延遲加載。

Start of main. 
In getInstance(). 
In SingletonHolder static block. 
In constructor. 
Singleton working. 
End of main. 

無支架

public class Singleton { 

    static { 
     System.out.println("In Singleton static block."); 
    } 

    private static final Singleton INSTANCE = new Singleton(); 

    public static Singleton getInstance() { 
     System.out.println("In getInstance()."); 
     return INSTANCE; 
    } 

    private Singleton() { 
     System.out.println("In constructor."); 
    } 

    private void doSomething() { 
     System.out.println("Singleton working."); 
    } 

    public static void main(String[] args) { 
     System.out.println("Start of main."); 
     Singleton.getInstance().doSomething(); 
     System.out.println("End of main."); 
    } 

} 

輸出預先加載表明main方法開始getInstance()方法被調用,因此急切裝載。

In Singleton static block. 
In constructor. 
Start of main. 
In getInstance(). 
Singleton working. 
End of main.