java单例实例化

标签 java singleton instance

我找到了三种实例化 Singleton 的方法,但我怀疑其中哪一种是最好的。我在多线程环境中使用它们并且更喜欢惰性实例化。
示例 1:

private static final ClassName INSTANCE = new ClassName();

public static ClassName getInstance() {
    return INSTANCE;
}

示例 2:

private static class SingletonHolder { 
    public static final ClassName INSTANCE = new ClassName();
}

public static ClassName getInstance() {
    return SingletonHolder.INSTANCE;
}

示例 3:

private static ClassName INSTANCE;

public static synchronized ClassName getInstance()
{
    if (INSTANCE == null)
        INSTANCE = new ClassName();

    return INSTANCE;
}

我正在使用 ATM 的项目到处都使用示例 2,但我更喜欢示例 3。还有枚举版本,但我就是不明白。

这里的问题是——在哪些情况下我应该/不应该使用这些变体?不过,我并不是在寻找冗长的解释(还有很多其他主题,但它们最终都会变成争论 IMO),我希望用几句话就可以理解。

最佳答案

在 java 中实现单例的最安全和最简单的方法是使用枚举(就像你提到的那样):

public enum ClassName {
    INSTANCE;

    // fields, setters and getters
}

枚举语义保证只有一个INSTANCE

如果不使用枚举方法,则必须注意很多方面,例如竞争条件和反射。我一直在破坏某些框架的单例并滥用它们,因为它们没有正确编写。枚举保证没有人会破坏它。

关于java单例实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706216/

相关文章:

Jquery 插件在不同实例上表现不同

C++ 嵌套类实例

java - NullPointerException:没有给出应用程序实例,getinstance() 甚至 this(!?) 似乎返回 null

java - 使用两个堆栈实现队列奇怪的错误

c# - 我是否需要在 ASP.NET 中配置 Web 服务引用?我可以使用单例吗?

java - 将嵌套的 for 循环变成单个 for 循环

c++ - 静态函数的单例类 dlopen 错误(无法在示例代码中重现)!

c# - 是否可以在接口(interface)中包装 C# 单例?

java - java中的if语句帮助

java动态显示JLabel