デザインモード-モノトーンモード


モノトーンモード


定義
  • モノトーンモードでは、このようなインスタンスを任意の場所でアクセスするために1つだけ作成します.
  • を使用する理由と特徴
  • オブジェクトのうち、1つだけ使用できます.有線プール、キャッシュ、ユーザー設定、レジストリ設定、プリンタなどです.
  • リソースを大量に使用するオブジェクトが必要な場合にのみ、オブジェクトを作成および使用できます.
  • 方法

  • 古いコード

    /**
     * 멀티스레딩이 해결되지 않은 싱글톤 생성 방식
     */
    public class Singleton_step1_with_problem {
    
        /**
         * 유일한 인스턴스를 저장하기 위한 정적 변수
         */
        private static Singleton_step1_with_problem uniqueInstance;
    
        /**
         * 생성자를 private으로 선언했기 때문에 해당 클래서에서만 인스턴스를 만들 수 있다
         */
        private Singleton_step1_with_problem() {}
    
        public static Singleton_step1_with_problem getInstance() {
            if (uniqueInstance == null) uniqueInstance = new Singleton_step1_with_problem();
            return uniqueInstance;
        }
    
    }
    

  • 非同期時の問題
    2つの
  • インスタンスの問題
  • を生成することができる.

    プロセスとコードの改善

  • 同期の使用
  • の同期を使用すると、パフォーマンスはポイント対ポイントの
  • の100倍に低下します.
  • インスタンスを最初に作成するときに同期は必要ありませんが、いくつかの問題があります.
  • public class Singleton_step2_synchronized {
    
        /**
         * 유일한 인스턴스를 저장하기 위한 정적 변수
         */
        private static Singleton_step2_synchronized uniqueInstance;
    
        /**
         * 생성자를 private으로 선언했기 때문에 해당 클래서에서만 인스턴스를 만들 수 있다
         */
        private Singleton_step2_synchronized() {}
    
        /**
         * synchronized 동기화 처리 -> 멀티스레드 해결
         */
        public static synchronized Singleton_step2_synchronized getInstance() {
            if (uniqueInstance == null) uniqueInstance = new Singleton_step2_synchronized();
            return uniqueInstance;
        }
    }
    必要に応じて作成するのではなく、JVMの実行時に作成します.
  • に設定されたグローバル変数との違いは、クラスのインスタンスを提供できないことです.
  • public class Singleton_step3_create_jvm {
        /**
         * 유일한 인스턴스를 저장하기 위한 정적 변수
         */
        private static final Singleton_step3_create_jvm uniqueInstance = new Singleton_step3_create_jvm();
    
        /**
         * 생성자를 private으로 선언했기 때문에 해당 클래서에서만 인스턴스를 만들 수 있다
         */
        private Singleton_step3_create_jvm() {}
    
        public static Singleton_step3_create_jvm getInstance() {
            return uniqueInstance;
        }
    }
  • デュアルチェックロック(DCL)による同期負荷低減
  • public class Singleton_step4_DCL {
        /**
         * 유일한 인스턴스를 저장하기 위한 정적 변수
         * volatile을 통한 동기화 변수 선언
         */
        private volatile static Singleton_step4_DCL uniqueInstance;
    
        /**
         * 생성자를 private으로 선언했기 때문에 해당 클래서에서만 인스턴스를 만들 수 있다
         */
        private Singleton_step4_DCL() {}
    
        /**
         * synchronized 동기화 처리 -> 멀티스레드 해결
         */
        public static synchronized Singleton_step4_DCL getInstance() {
            if (uniqueInstance == null) uniqueInstance = new Singleton_step4_DCL();
            return uniqueInstance;
        }
    }