Java 免费延迟初始化

Java 免费延迟初始化,java,jvm,singleton,lazy-initialization,double-checked-locking,Java,Jvm,Singleton,Lazy Initialization,Double Checked Locking,在一篇关于双重检查锁定习惯用法的文章中,我发现了这样一句话: 惰性初始化的一个特例是静态单例,它在没有同步的情况下确实能按预期工作。当初始化对象是类的静态字段,没有其他方法或字段时,JVM会自动有效地执行延迟初始化 为什么强调部分很重要?如果有其他方法或字段,为什么不起作用 (这篇文章已经有10多年的历史了。这些信息还相关吗?它的意思可能是,如果一个类没有其他方法或字段,那么您只能为单例访问它,因此单例仅在需要时创建。否则,例如 class Foo { public static fi

在一篇关于双重检查锁定习惯用法的文章中,我发现了这样一句话:

惰性初始化的一个特例是静态单例,它在没有同步的情况下确实能按预期工作。当初始化对象是类的静态字段,没有其他方法或字段时,JVM会自动有效地执行延迟初始化

为什么强调部分很重要?如果有其他方法或字段,为什么不起作用


(这篇文章已经有10多年的历史了。这些信息还相关吗?

它的意思可能是,如果一个类没有其他方法或字段,那么您只能为单例访问它,因此单例仅在需要时创建。否则,例如

class Foo 
{
    public static final Foo foo = new Foo();

    public static int x() { return 0; }
}

class AnotherClass
{
    void test() 
    {
        print(Foo.x());
    }
}
在这里,
foo
被实例化,尽管它从未被要求


但是有私有的静态方法/字段是可以的,这样其他人就不会意外地触发类初始化。

“没有其他方法或字段的类的静态字段”-但是在您的示例中,Foo有一个方法x(),是的,因为他在文中给出了反例,这里的单例并不是真正的懒惰,因为它可能是在需要之前创建的。啊,好吧,但在单例实现中,通常只有一个静态方法返回实例,而所有其他方法都是非静态的,对吗?+1个有趣的问题。最初我的猜测是,这是JVM唯一能够确保在从类外部引用该对象之前不会对该对象进行调用的时间;但这似乎并没有说明什么。