在双重检查锁定习语的article中,我找到了这个引用:
延迟初始化的一个特殊情况是在没有同步的情况下按预期工作的是静态单例。当初始化对象是没有其他方法或字段的类的静态字段时,JVM会自动有效地执行延迟初始化。
为什么强调部分很重要?如果是其他方法或字段,为什么它不起作用?
(这篇文章已经超过10年了。信息是否仍然相关?)
答案 0 :(得分:4)
这意味着,如果一个类没有其他方法或字段,那么你只能为单例访问它,所以只在需要时创建单例。否则,例如
class Foo
{
public static final Foo foo = new Foo();
public static int x() { return 0; }
}
class AnotherClass
{
void test()
{
print(Foo.x());
}
}
这里,foo
被实例化,但从未被要求过。
但是可以使用私有静态方法/字段,因此其他人不会意外触发类初始化。