我正在做一些關於單例的研究,特別是關於單例的懶惰和渴望的初始化。延遲加載和線程安全相結合的單例模式
渴望初始化的例子:
public class Singleton
{
//initialzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
但高於它是渴望初始化和線程安全留給JVM 但現在,我希望能有同樣的模式,但與延遲初始化,如圖所示。
所以我想出這種方法:
public final class Foo {
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
}
如上所示由於線
private static final Foo INSTANCE = new Foo();
當類FooLoader實際使用時才執行,這需要照顧的延遲實例的,並且它保證是線程安全的。
這是正確的嗎?
Duplicate http://stackoverflow.com/q/5842273/823393 – OldCurmudgeon
這不是真的懶惰的初始化嗎?該實例可以在調用getInstance方法之前加載。 – Perception
這當然是懶惰的。 「INSTANCE」僅在該類的第一個引用中實例化。這隻會在第一次調用'getInstance'時引用。雖然我會刪除構造函數中的創建檢查。 –