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