懒惰初始化免费

fre*_*low 5 java singleton jvm double-checked-locking lazy-initialization

在关于双重检查锁定习语的文章中,我发现了这个引用:

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

为什么强调部分很重要?为什么如果没有它的工作其他方法或领域?

(这篇文章已经超过10年了.信息是否仍然相关?)

irr*_*ble 5

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

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

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

class AnotherClass
{
    void test() 
    {
        print(Foo.x());
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,foo被实例化,尽管从未被要求过。

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