Java Singleton:在构造函数中引发异常

Java Singleton:在构造函数中引发异常,java,reflection,singleton,Java,Reflection,Singleton,为了防止使用反射破坏Singleton,一种方法是在私有构造函数中抛出异常,如下代码所示: public final class Foo { private static final Foo INSTANCE = new Foo(); private Foo() { if (INSTANCE != null) { throw new IllegalStateException("Already instantiated");

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

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;
    }
}

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

创建反射安全单例的最佳方法是使用枚举。
创建反射安全单例的最佳方法是使用枚举。

在加载类之前,无法访问类的静态成员(无论是直接访问还是通过反射访问)。在加载过程中初始化静态最终构件()

因此,在您的情况下,线程不可能:

  • 在正确构造实例之前,请参见实例
  • 请将
    INSTANCE
    视为null(除非对
    new Foo()的第一次调用引发异常)
  • 初始化第二个实例(除非该代码依赖)

在加载类之前,无法访问类的静态成员(无论是直接访问还是通过反射访问)。在加载过程中初始化静态最终构件()

因此,在您的情况下,线程不可能:

  • 在正确构造实例之前,请参见实例
  • 请将
    INSTANCE
    视为null(除非对
    new Foo()的第一次调用引发异常)
  • 初始化第二个实例(除非该代码依赖)

我知道,但我的问题是关于这个方法:)那么我不理解你的问题;-)我知道,但我的问题是关于这个方法:)那么我不理解你的问题;-)