我正在做一些关于单例的研究,特别是关于单例的惰性初始化和急切初始化。
急切初始化的示例:
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 时执行,这会处理延迟实例化,并保证是线程安全的。
它是否正确?