我正在做一些关于单例的研究,特别是关于单例的惰性初始化和急切初始化。
一个急切初始化的例子:
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 时执行,它负责惰性实例化,并保证线程安全。
这是正确的吗?
最佳答案
关于java - 结合延迟加载和线程安全的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15792186/