有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java何时使用合适版本的singleton threadsafe实现?

我有一个类似无状态助手的类,我想将其作为一个单例。该类将在不同线程之间共享

在这种情况下(实例不需要巨大的内存分配大小,因此可以在不影响资源和性能的情况下多次加载),没有必要使用适当的多线程延迟初始化策略实现这样的单例,对吗(双重检查锁定和易失性、按需持有者习惯用法、枚举单例、同步访问器)

为了减少样板代码的数量,使用简单的非多线程惰性初始化版本策略(如下面的代码)实现这样一个单例是否正确

public class Singleton {
    private static Singleton INSTANCE;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Singleton();
        }
        return INSTANCE;
    }
}

只有当单例类的状态在不同线程之间共享时,才需要添加单例初始化的正确多线程版本


共 (2) 个答案

  1. # 1 楼答案

    如果你的类是完全无状态的,那么就把它变成一个只有静态函数的util类

    如果你有状态,想要一个半单例,我会说你所做的是误导性的,因为读者无法知道你是否意识到你可以得到多个实例。如果你决定坚持使用你发布的代码,请将其重命名为multiton或仔细记录其行为。但不要只是为了简化样板文件——事实上,你给读者带来的问题比你删除的要多

    在我看来,“按需初始化持有者”是最好的单例模式。但我建议大家不要单身。启动线程时,最好将对共享实例的引用传递给线程

  2. # 2 楼答案

    要回答你的问题。。。不,这不对

    你说它可以被加载几次,但在这种情况下,它不是一个单例。单例的定义特征是,只能有一个实例

    如果可以有几个,那为什么要把它变成一个单身呢

    如果它只是无状态的util方法,那么为什么不让它成为静态的呢