【问题标题】:Singleton solution单例解决方案
【发布时间】:2013-03-05 13:46:16
【问题描述】:

this博客中:

清单 10 中的代码不使用同步,并确保 在调用静态对象之前,不会创建 Singleton 对象 getInstance() 方法。

上面的引用不是错误的吗?由于静态对象是在类的早期初始化的,那么在调用静态getInstance() 方法之前如何不创建对象?

【问题讨论】:

  • getInstance() 是该类的 static-context 中唯一可用的方法。对于它的执行,将执行静态初始化(因此创建对象)。因此,在调用静态方法之前不会创建任何对象。

标签: java methods static singleton


【解决方案1】:

问题中引用的代码本质上是这样的:

class Singleton {
  private static Singleton instance = new Singleton();

  public static Singleton getInstance() {
    return instance;
  }
}

这个线程安全的,因为实例不是惰性初始化的,而是在类加载时实例化一次。

类加载器强制执行自己的同步以保证类初始化是线程安全的。

【讨论】:

  • @PeterLawrey 我认为枚举单例模式是对枚举的滥用(尽管它确实有效)。我更喜欢静态内部类模式,它提供惰性单元和线程安全,无需任何同步 - 这很神奇。
  • 您应该将 instance 设为 final 以保证对所有线程的最新可见性。
  • @Bohemian 枚举专门设计用于让您指定所有可能的实例。我什至将枚举用于实用程序类,以明确不应该有实例。编写自己的模式可能会导致仅限于一个实例,但它是不必要的间接且容易出错恕我直言。
  • 谢谢。我很清楚你发布的模式。但是我的问题是,在我粘贴的博客链接中,为什么直到调用 getInstance() 方法才启动 Singleton 对象?加载类时不是所有的静态对象都初始化了吗?
  • getter 的意义何在?你可以改成静态变量public final,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多