【问题标题】:What is non-lazy initialization?什么是非延迟初始化?
【发布时间】:2018-01-23 02:43:19
【问题描述】:

相信大家都知道下面单例模式的实现:

public class Singleton {

private static volatile Singleton instance;

private Singleton(){}

public static Singleton getInstance() {

    if (instance == null) {
        synchronized (Singleton.instance){
            if (instance == null) {
                instance = new Singleton();
            }
        }
    }

    return instance;
}}

我知道这是一个对应于延迟初始化的实现。 但是 Java ClassLoader 以惰性模式加载类。

如何不延迟初始化任何对象? 无论对象实现,只有在您使用单词“new”或调用工厂方法时才会创建实例。

什么是非延迟类加载?

【问题讨论】:

  • 我不知道“单例模式的以下实现”。您发布的代码已损坏,将在synchronized (Singleton.instance) 行的 99.999% 的情况下抛出 NullPointerException。
  • 你问的是类“加载”还是“初始化”?你的标题说一个,你的最后一个问题说另一个。它们不是一回事。

标签: java classloader lazy-initialization


【解决方案1】:

非延迟加载将在加载类时立即实例化instance,而不是等到第一次调用getInstance()

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

    private Singleton() { }

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

如果类已加载但没有人调用getInstance(),则创建一个从未使用过的对象会浪费时间和内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2010-11-02
    • 2020-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多