私はAtomicReferenceクラスに出くわし、これが変更可能でテスト用に置き換えることができるシングルトンを作成する良い方法になるかどうか疑問に思っていました。
二重ロックのチェックに問題があることはわかっているので、そのルートには行きたくありませんでした。 JDK 1.5 の時点で修正されました ( https://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html )。
また、シングルトンを初期化するのではなく、遅延してインスタンス化することをお勧めします。たとえば、テスト中はデフォルトのクラスを使用したくありませんSimpleExample
が、場合によっては、作成にコストがかかるか、特定の環境で問題が発生します。依頼前に交換していただけると助かります。
public class SingletonExample {
private static AtomicReference<SingletonExample> sInstance = new AtomicReference<>();
private SingletonExample() {
}
public static SingletonExample getInstance() {
return sInstance.updateAndGet(u -> u != null ? u : new SingletonExample());
}
@VisibleForTesting
static void setInstance(SingletonExample singletonExample) {
sInstance.set(singletonExample);
}
}
ここに私の質問があります:
- 大きなパフォーマンス ヒットはありますか?
- シングルトンとして使用することに気付いていない問題はありますか?
- 合理的な代替手段は何ですか?