【问题标题】:Comparison b/w Lazy loading with double check lock Vs Class level initialization比较黑白延迟加载与双重检查锁与类级别初始化
【发布时间】:2013-10-10 05:55:02
【问题描述】:

假设我有一个 empty 构造函数 用于单个 ton 类,以下 2 种方法中哪一种更适合从公共 getInstance 方法返回实例?

  1. 类级初始化 {

    public class ClassName{
    
    private static ClassName instance = new ClassName ();
    }
    

    }

  2. 使用双重检查锁延迟加载

    if (null == instance) {
    
            synchronized (this) {
        if(null == instance) {
            instance = new className();
                }
        }
    }
    

我在想类级初始化在这里不会造成任何伤害。但想从专家那里确认一下。请帮忙

【问题讨论】:

  • 有什么理由不使用具有单个值的枚举来代替?那更简单。如果可以的话,我会避免双重检查锁定。 (我也会避免 if (null == instance) 的“尤达条件”,因为 if (instance == null) 对大多数人来说更具可读性。哦,你不能在静态方法中同步 this - 并且方法 would 必须是静态的...
  • synchronize(this) -> synchronized(SingletonClass.class)

标签: java multithreading singleton


【解决方案1】:

您应该有一个私有构造函数和一个final 实例字段。理想情况下,班级也应该是final。最简单的方法是使用枚举

public enum Singleton implements MyInterface {
    INSTANCE;
} 

【讨论】:

  • 我不认为枚举方式对单身人士很好,它对无状态单例有好处,无状态单例会使所有方法都静态而不是遵循单例方法。
  • @user2511414 如果可能的话,所有单例都应该是 statelsss,但你不会再使用 enum。所以虽然不好,但也没有更糟。
  • 不同意,所以如果所有单例都应该是无状态的,那么Math 类也应该是单例,或者ContextInitialize,或者System
  • @user2511414 好点。如果你需要实现一个接口,你只需要一个单例,理想情况下应该是无状态的。
  • 好点,但通常为了将接口实现为单一的,我宁愿提供一些命名和目录模块,让他只关心实例和管理,你的例子会像 JEE 中的 ObjectFactory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多