如果不是懒惰初始化,使用方法而不是静态类成员构建单例是否有任何优势?

时间:2014-03-05 15:18:54

标签: java

我经常看到以这种方式构建的单身人士:

public static MyClass instance() {
    if (singleton == null) {
        singleton = new MyClass();
    }
    return singleton;
}

如果不是懒惰的初始化效果,那么该方法是否比简单地声明像这样的静态实例有任何优势?

public final static MyClass singleton = new MyClass();

1 个答案:

答案 0 :(得分:0)

不,实际上是另一种方法,即:

public final static MyClass singleton = new MyClass();

可能会更好,因为如果你有2个线程同时调用实例方法,你可能会遇到竞争条件。

这就是Java in Practice所说的做单身人士的方式:

  private final static MyClass _instance = new MyClass();

  public static MyClass getInstance() {
    return _instance;
  }

  private MyClass() {}

更新自@ jon-skeet提到它以来,Joshua Block在“Effective Java”一书中对单身人士进行了很好的讨论。他指出的一件事是,如果你想让你的Singleton可序列化,你不能只实现Serializable。您还需要覆盖readResolve方法。使用上述方法可以轻松实现:

private Object readResolve() throws ObjectStreamException {
  return _instance;
}

更新2 :查看关于@mardavi链接的单身人士的精彩讨论:http://en.wikipedia.org/wiki/Singleton_pattern#Initialization_On_Demand_Holder_Idiom