gpt4 book ai didi

java - Singleton:在构造函数中抛出异常

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:33 25 4
gpt4 key购买 nike

为了防止使用反射破坏 Singleton,一种方法是在私有(private)构造函数中抛出异常,如下代码所示:

public final class Foo {

private static final Foo INSTANCE = new Foo();

private Foo() {
if (INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}

public static Foo getInstance() {
return INSTANCE;
}
}

上面是标准代码,但我在想的是它是线程安全的吗?如果多个线程尝试同时使用反射创建实例[即在类加载到主内存之前,这意味着实例将为 null ] 那么它们会成功吗?

最佳答案

在加载类之前,您无法访问类的静态成员(无论是直接访问还是通过反射访问)。静态最终成员在加载过程中初始化 ( step 9 of the JLS description )。

所以在你的情况下,线程不可能:

  • 在正确构建之前请参阅INSTANCE
  • INSTANCE 视为 null(除非第一次调用 new Foo() 引发异常)
  • 初始化第二个实例(除非该代码依赖 a different class loader)

关于java - Singleton:在构造函数中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com