リフレクションを使用して Singleton が壊れないようにする方法の 1 つは、次のコードに示すように、プライベート コンストラクターで例外をスローすることです。
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 になることを意味するメイン メモリにクラスがロードされる前]、それらは成功しますか?