研磨設計モードの単例モード(内部クラス)

1547 ワード

前言
Javaの単例モードでは、怠け者式が餓漢式よりも優雅であることを知っている人が多いと思いますが、ここで教えてあげたいのは、私のところには、より優雅な単例設計モードがあります.
適切な基礎知識
1、クラスクラスクラスの内部クラスとは何ですか.簡単に言えば、クラスレベルの内部クラスとは、static修飾のあるメンバーの内部クラスを指す.static修飾のないメンバー式内*クラスをオブジェクトレベル内部クラスと呼ぶ.2、クラスレベルの内部クラスはその外部クラスのstatic成分に相当し、そのオブジェクトと外部クラスオブジェクトとの間に依存関係がないため、*は直接作成することができる.オブジェクトレベルの内部クラスのインスタンスは、外部オブジェクトインスタンスにバインドされます.3、クラスレベルの内部クラスでは、静的な方法を定義できます.静的メソッドでは、外部クラスの静的メンバーメソッドまたは変数のみが参照されます.4、クラスレベルの内部クラスはその外部クラスのメンバーに相当し、初めて使用されたときにのみマウントされます.
マルチスレッドのデフォルト同期ロックの知識:
マルチスレッド開発では、同時性の問題を解決するためにsynchronizedを使用して反発ロックを追加して同期制御を行うことが主ですが、場合によってはJVMが暗黙的に同期を実行している場合があります.これらの場合、自分で同期制御を行う必要はありません.
次のような状況があります.
1、スタティックイニシエータ(スタティックフィールドまたはstatic{}ブロックのイニシエータ)によってデータをイニシエータ化する場合2、finalフィールドにアクセスする場合3、スレッドを作成する前にオブジェクトを作成する場合4、スレッドが処理するオブジェクトを見ることができる場合
ソリューションの考え方
スレッドのセキュリティを簡単に実現するには、JVMによってスレッドのセキュリティを保証する静的初期化器を使用します.例えば、前の餓漢式の実現方式です.しかしこれでは、一定のスペースが無駄になるのではないでしょうか.この実装では、必要かどうかにかかわらず、クラスのマウント時にオブジェクトを初期化します.クラスをマウントするときにオブジェクトを初期化しない方法があれば、問題を解決するのではないでしょうか.1つの実行可能な方法は、クラスレベルの内部クラスを採用し、このクラスレベルの内部クラスでオブジェクトインスタンスを作成することです.これにより、このクラスレベルの内部クラスを使用しない限り、オブジェクトインスタンスは作成されず、遅延ロードとスレッドセキュリティが同期されます.
public class InnnerClassSingle {
    //       
    private InnnerClassSingle(){
        
    }

    public static InnnerClassSingle getInstance(
    {
        return SingleHodler.instance;
    }
    
    private static class SingleHodler{
        //      , JVM       
        private static final InnnerClassSingle instance = new InnnerClassSingle();
    }
}