Javaベースシングルトンいくつかの実装

 

まず、シングルトンは何ですか

    

    シングル例:クラスのインスタンスを1つだけ確実に、そしてそれはグローバルなアクセスポイントへのアクセスを提供します。

    Singletonパターンは、共通のデザインパターンの一つであり、唯一の目的は、唯一のアプリケーションクラス全体でインスタンスの存在を確実にするためです。

    例えば、我々は、システムの起動時に、アプリケーションのライフサイクル全体のために、いくつかの一般的な設定情報をロードする必要が見えるとユニークで、その後、必要がシングルトンを設計します。以下のような:春のコンテナ、セッションファクトリ、キャッシュ、データベース接続プールなどが挙げられます。

 

第二に、どのように唯一のインスタンスを確保するために、

         1)外部から開始されないようにするには

    2)単独でクラスがインスタンス化

    3)一度インスタンス化していることを確認

    4)のインスタンスを取得するために外部の方法を提供

    5)スレッドセーフ

第三に、シンプルな関心のいくつかのモデルの比較

 

(1)式を飢え

静的なプライベート変数定義されたクラスでインスタンス化しながら、「空腹なので、そう遅滞なく、すぐに食べます」。

パブリック クラスシングルトン{
     プライベート 静的 最終シングルトンシングルトン= 新しいシングルトン()。

    プライベートシングルトン(){ 
    } 

    パブリック 静的シングルトンのgetInstance(){
         戻りシングルトン。
    } 

}

①静的プライベートクラス変数を宣言すると、すぐに一度インスタンス化を確実インスタンス化

②プライベート防止するように構成された外部インスタンス化(反射によってインスタンス化することができ、このような場合を考慮しません)

③外部のシングルトンインスタンスを取得するための公共のgetInstance()メソッドを提供します

利点:;:クラスローダインスタンスの初期化、メモリの無駄であるスレッドセーフでは高速な欠点のインスタンスを取得します。

 

2)怠惰なスタイル

「人々は怠惰な、というように、あなたのためにそれをインスタンス化するために使用されている場合、」遅延読み込みを。

パブリッククラスシングルトン{

プライベート静的シングルトンシングルトン= NULL;

パブリック クラスシングルトン{
     プライベート 静的シングルトンシングルトン= nullを

    プライベートシングルトン(){ 
    } 

    パブリック 静的シングルトンのgetInstance(){
         場合(シングルトン== NULL ){ 
            シングルトン = 新しいシングルトン()。
        } 
        戻りシングルトン。
    } 

}

利点:インスタンスを取得する処理で、実施例の初期化、システム資源を節約します

短所:①、より多くの初期化インスタンスを取得中に、読み込み速度が遅くなり、部門がシステムに影響を与えることができます

②非ヌルチェックのすべてのインスタンスは、大きなオーバーヘッドが行われるべきで取得します

③非スレッドセーフで、複数のスレッドがのgetInstanceを(アクセスした場合)、複数のインスタンスを引き起こす可能性があります。

 

次に、上記の例では、安全性の向上をスレッドします。

(1)同期ロック。

パブリック クラスシングルトン{
     プライベート 静的シングルトンシングルトン= nullを

    プライベートシングルトン(){ 
    } 

    パブリック 同期 静的シングルトンのgetInstance(){
         場合(シングルトン== NULL ){ 
            シングルトン = 新しいシングルトン()。
        } 
        戻りシングルトン。
    } 
    
}

長所:スレッドセーフ、短所:限り取得がロックする必要はありません後に例が生成されているとして、実際には、リソースを大量に消費する、ロックする時間のインスタンスを取得します。

(2)ダブルチェックロック:

パブリック クラスシングルトン{
     プライベート 静的シングルトンシングルトン= nullを

    プライベートシングルトン(){ 
    } 

    パブリック 静的シングルトンのgetInstance(){
         場合(シングルトン== NULL ){
             同期(シングルトン。クラス){
                 場合(シングルトン== NULL ){ 
                    シングルトン = 新しいシングルトン()。
                } 
            } 
        } 
        戻りシングルトン。
    } 

}

長所:初期化されていないインスタンスの前にのみ同期、高効率の欠点を確保するために、スレッドセーフな、ダブルチェック:空でないかの判断の例として、特定のリソースを消費します。

(3)静的内部クラス:

パブリック クラスシングルトン{
     プライベートシングルトン(){ 

    } 

    プライベート 静的 クラスSingletonHolder {
         プライベート 静的 最終シングルトンシングルトン= 新しいシングルトン()。
    } 

    パブリック 静的シングルトンのgetInstance(){
         戻りSingletonHolder.singletonと、
    } 

}

利点:同期パフォーマンスコストを回避するだけでなく、ロードを遅らせることができないだけ。

(4)列挙:

パブリック 列挙シングルトン{ 
    INSTANCE; 
    公共 ボイドのinit(){ 
        System.out.printlnは( "リソース初期化" ); 
    } 
}

Naturalスレッドセーフな反射を防止するには、インスタンスを生成しました。

 

第四に、シングルトンの長所と短所:

利点:そこクラスのインスタンスが1つだけで、システムリソースを節約する、実施形態のシングルモードを使用して作成されたオブジェクトの頻繁な破壊の必要性は、システムのパフォーマンスを向上させることができます。 

短所:(新)外でインスタンス化できない、いないときにソースコードを見ている場合は特にインスタンス、混乱するために呼び出す呼び出すためにどの方法がわかりません。

 

おすすめ

転載: www.cnblogs.com/cat520/p/11259400.html