java - 结合延迟加载和线程安全的单例模式

标签 java design-patterns singleton

我正在做一些关于单例的研究,特别是关于单例的惰性初始化和急切初始化。

一个急切初始化的例子:

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 时执行,它负责惰性实例化,并保证线程安全。

这是正确的吗?

最佳答案

在我看来,您的第二个代码片段是线程安全延迟初始化单例的最佳方式。它实际上有一个模式名称

Initialization-on-demand holder idiom

我建议你使用它。

关于java - 结合延迟加载和线程安全的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15792186/

相关文章:

使用 new 运算符和 .class.newInstance() 方法创建 java 对象

java - Apache tika 和 apache ctakes

c# - 缓存数据库查询的最佳方法是什么

java - 如何从类名字符串中获取单例实例

JavaFX 2.2 Stage 始终在最前面

java - 为什么泛型绑定(bind) "E implements I"会导致编译器错误?

objective-c - 对于具有大量查找表的 iOS 应用程序,什么是好的模式?

design-patterns - 我想使用最直观的异步设计模式并需要功能和适当的命名

ios - 可以在单例中设置我的 AVFoundation 相机吗?

singleton - 在 dotnet 核心中,如何确保我的应用程序只有一个副本在运行?