-1

マルチスレッド環境でクラスのインスタンスが 1 つだけ作成されるようにするために、以下の構造を持つシングルトン クラスを作成します。

class Singleton {

    private volatile static Singleton _instance;

    private Singleton() {
        // preventing Singleton object instantiation from outside
    }

    public static Singleton getInstanceDC() {
        if (_instance == null) {
            synchronized (Singleton.class) {
                if (_instance == null) {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }
}

null checkしかし、静的関数からオブジェクトを取得する前に実行中にすべてのスレッドが支払わなければならないペナルティを乗り越えることによって、クラスのパフォーマンスを向上させる方法はありますか?

4

3 に答える 3

3

これは時期尚早の最適化として知られています。実際には、null チェックが問題を引き起こしていることを知りません (そうではありません、私を信じてください)。null チェックのコストはナノ秒単位です。

実際に問題があることを確認してから、パフォーマンスについて心配してください。次に、プロファイリングを行って、問題の原因となっているコードのセクションを特定します。その認識を裏付けるパフォーマンス統計がなければ、問題のように「見える」ものを最適化しないでください。

于 2016-04-01T18:58:22.807 に答える
2

ジョシュ・ブロックによると。Java 1.5以降の効果的なJava Second Editionこれが最良のアプローチです

public enum Singelton {
  INSTANCE;
}

高度なシリアライゼーション攻撃やリフレクション攻撃に対しても安全です。

ただし、シングルトンはテスト可能性を擁護することに常に留意してください。質問のシングルトンは、リフレクションを使用してテスト目的でリセットできますが、私の回答のも​​のはおそらくできません。

したがって、Singleton が必要かどうかをよく考えることをお勧めします。私は常にシングルトンを避けています。

于 2016-04-01T19:06:11.080 に答える