java何时使用合适版本的singleton threadsafe实现?
我有一个类似无状态助手的类,我想将其作为一个单例。该类将在不同线程之间共享
在这种情况下(实例不需要巨大的内存分配大小,因此可以在不影响资源和性能的情况下多次加载),没有必要使用适当的多线程延迟初始化策略实现这样的单例,对吗(双重检查锁定和易失性、按需持有者习惯用法、枚举单例、同步访问器)
为了减少样板代码的数量,使用简单的非多线程惰性初始化版本策略(如下面的代码)实现这样一个单例是否正确
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
只有当单例类的状态在不同线程之间共享时,才需要添加单例初始化的正确多线程版本
# 1 楼答案
如果你的类是完全无状态的,那么就把它变成一个只有静态函数的util类
如果你有状态,想要一个半单例,我会说你所做的是误导性的,因为读者无法知道你是否意识到你可以得到多个实例。如果你决定坚持使用你发布的代码,请将其重命名为multiton或仔细记录其行为。但不要只是为了简化样板文件——事实上,你给读者带来的问题比你删除的要多
在我看来,“按需初始化持有者”是最好的单例模式。但我建议大家不要单身。启动线程时,最好将对共享实例的引用传递给线程
# 2 楼答案
要回答你的问题。。。不,这不对
你说它可以被加载几次,但在这种情况下,它不是一个单例。单例的定义特征是,只能有一个实例
如果可以有几个,那为什么要把它变成一个单身呢
如果它只是无状态的util方法,那么为什么不让它成为静态的呢