1

リフレクションを使用して 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 になることを意味するメイン メモリにクラスがロードされる前]、それらは成功しますか?

4

2 に答える 2

1

ロードされる前に、(直接またはリフレクションを介して) クラスの静的メンバーにアクセスすることはできません。また、静的な最終メンバーは、ロード プロセス中に初期化されます ( JLS の説明のステップ 9 )。

したがって、あなたの場合、スレッドができる方法はありません:

于 2013-05-27T16:26:21.450 に答える
0

リフレクション セーフなシングルトンを作成する最善の方法は、列挙型を使用することです。 ここに記載されています

于 2013-05-27T16:22:42.530 に答える