何时使用正确版本的单例线程安全实现?
When to use proper version of singleton thread-safe implementation?
我有一个像 class 这样的无状态助手,我想将其作为单身人士使用。此 class 将在不同线程之间共享。
我是否更正了在这种情况下(实例不需要巨大的内存分配大小,因此可以加载多次而不会影响资源和性能)没有必要通过适当的多线程延迟初始化来实现这样的单例策略(双重检查锁定和易失性、按需持有者习语、枚举单例、同步访问器)?
为了减少样板代码的数量,使用简单的非多线程延迟初始化版本策略(如下面的代码)实现这样的单例是否正确?
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
并且仅当单例状态 class 在不同线程之间共享时,才需要添加适当的多线程版本的单例初始化?
回答你的问题...不,这是不正确的。
你说加载几次没问题,那它就不是单例了。单例的定义特征是永远只能有一个实例。
如果有几个没问题,那为什么要把它做成单例呢?
如果它只是无状态的 util 方法,那为什么不直接制作静态的呢?
如果您的 class 是完全无状态的 - 将其设置为仅具有静态功能的实用程序 class。
如果你有状态并且想要一个半单例,我会说你所做的是误导,因为 reader 无法知道你是否知道你可以得到是否有多个实例。如果您决定坚持使用已发布的代码 - 将其重命名为 multiton 或仔细记录行为。但是,不要只是为了减少样板文件而这样做 - 实际上,您为 reader 制造的问题比您移除的问题还要多。
在我看来,"Initialization on Demand Holder" 惯用法是最好的单例模式。但我一般建议不要使用单身人士。您最好在启动线程时将对共享实例的引用传递给您的线程。
我有一个像 class 这样的无状态助手,我想将其作为单身人士使用。此 class 将在不同线程之间共享。
我是否更正了在这种情况下(实例不需要巨大的内存分配大小,因此可以加载多次而不会影响资源和性能)没有必要通过适当的多线程延迟初始化来实现这样的单例策略(双重检查锁定和易失性、按需持有者习语、枚举单例、同步访问器)?
为了减少样板代码的数量,使用简单的非多线程延迟初始化版本策略(如下面的代码)实现这样的单例是否正确?
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
并且仅当单例状态 class 在不同线程之间共享时,才需要添加适当的多线程版本的单例初始化?
回答你的问题...不,这是不正确的。
你说加载几次没问题,那它就不是单例了。单例的定义特征是永远只能有一个实例。
如果有几个没问题,那为什么要把它做成单例呢?
如果它只是无状态的 util 方法,那为什么不直接制作静态的呢?
如果您的 class 是完全无状态的 - 将其设置为仅具有静态功能的实用程序 class。
如果你有状态并且想要一个半单例,我会说你所做的是误导,因为 reader 无法知道你是否知道你可以得到是否有多个实例。如果您决定坚持使用已发布的代码 - 将其重命名为 multiton 或仔细记录行为。但是,不要只是为了减少样板文件而这样做 - 实际上,您为 reader 制造的问题比您移除的问题还要多。
在我看来,"Initialization on Demand Holder" 惯用法是最好的单例模式。但我一般建议不要使用单身人士。您最好在启动线程时将对共享实例的引用传递给您的线程。