サイケシングルトンデザインパターン、飢え、すべての怠惰を取得します

シングルトン

Singletonパターンは、最小限のコードモードかもしれないが、必ずしもあなたが良い使用シングルトンモードを作りたい、それほど単純で意味するものではありません、本当に脳の多くの費用があります。誤りや見落としが、私を修正するために読者を促す場合は、この論文では、Javaのシングルトンでは一般的には、書かれた要約を作りました

飢えた男

1.飢えた男アプリケーションが作成と実行にシングルトンインスタンスまたはわずかなオーバーヘッドを作成して使用することが常にある場合

classSingle {private Single(){} private static Single single= newSingle(); public static Single getInstance(){ return single; } 

クラスローダでハングリー男単一の例では、外部で使用するための静的初期化されたオブジェクトを作成し、システムが再起動されない限り、オブジェクトは変更されません、それはスレッドセーフそのものです。

クラスのコンストラクタによって定義シングルトンがインスタンス化されているのと同じ範囲内の仮想マシン、外部回避する、唯一のインスタンスは、シングルトンのgetInstance()メソッドがプライベートでアクセスすることができます。(実際には、Javaリフレクション機構を介してクラスのコンストラクタがプライベートでインスタンス化することが可能であり、それは基本的には、暫定的に目が考えられていない閉じ反射を。この問題は、ここで議論されていない単一のケースを達成するために、すべてのJavaの障害になりますそれは存在しています。)

Sluggard

2.レイジーオーバーヘッドが比較的大きい場合は、シングルトンのインスタンスを作成するときに、初期化を遅らせることを検討してください使用したいがためたときに数同時に、スレッドセーフであるようなアプローチ以下の(ネットワークやストレージデバイスなど)いくつかの外部リソースを必要とし、ない場合は、2あれば、最初の場所で見つけることが可能であるの実装でのgetInstanceスレッドがコードの同期ブロックで終了する場合、1の場合はnullであり、それは外部待っている同期複数のスレッドを有することが可能です、このタイムコードもう一方の端のブロックを同期する、または単一の新しいを歩いていくには、();ので、この場合は、単一のケースではありません、そのため2 @で持っている必要があります。

class Single {private Single(){} private static Single single= null; public static Single getInstance(){ if ( single == null ) { //1 synchronized (Single.class) { if ( single == null) { single = newSingle(); } } } return single; } } 

このようなアプローチは、マルチスレッドではうまく動作しますが、呼び出されるたびにgetInstanceメソッドを同期させる必要がある、不要な同期のオーバーヘッドを引き起こし、そして時間のほとんどは、我々は同期よりも小さいので、私はこれをお勧めしませんすることができますモード

静的な内部クラス

classSingle { privateSingle(){} privatestatic class SingleHandler {private static Single single = new Single(); } public static Single getInstance(){ return Single. SingleHandler.single; } 

これは、クラスに対応する外側の静的クラスの内側部分は、そのスレッドのJVMによって安全性を確保することが可能であるが、内部機構は、シングルトンオブジェクトのロードを遅らせることができるように、クラスによって内部の静的クラスを作成します。この形式は、より推奨されます。

数え上げます

publicclassSingle { private Single(){} public enum SingleEnum { singleHandler; private Single single; privateSingleEnum () { single = new Single(); } public Single getSingle() { return single; } } public static Single getInstacne() { return SingleEnum.singleHandler.getSingle(); } } 

列挙メソッドは、作成自体列挙型クラスはスレッドセーフ、静的な内部クラスに似ているので、これは、最も簡単なの一つのケースを達成するために、私たちはどのようなDCL(ダブルチェックをロック)の問題を気にする必要はありません。実際には、アイデアは、「効果的な共有と各列挙定数クラスのstatic finalインスタンスをエクスポートして、コンストラクタにアクセスできないので、あなたが対応するオブジェクトを生成するために、列挙定数のコンストラクタメソッドを呼び出すことはできませんので、列挙するので、 Javaは」、列挙型は、タイプセーフな列挙モードでも、一般的な単一の実施形態の列挙と呼ばれます。

シングルモードのアプリケーションシナリオの例

シングルモードの実施形態の構造と機能の以前の分析は、以下の特性は、一般に、そのシーンに適しています。

  • オブジェクトがそうで、チーム内のクラスとして、すべての人のID番号であるとする場合のシナリオでは、いくつかの並べ替えにのみ生成する必要があります。
  • オブジェクトは、機会を共有する必要がある場合。Singletonパターンは、オブジェクトを作成することができますので、オブジェクトはメモリを節約し、オブジェクトのアクセス速度を高速化するために共有することができます。Webオブジェクトの設定、データベース接続プーリング、などが挙げられます。
  • ニーズの特定の種類は、作成されたオブジェクトをインスタンス化し、そのようなマルチスレッドのスレッドプール、インターネット接続プールのように、頻繁に破壊頻繁場合。

私は、みんなの注目を歓迎し、貴重な足跡を残して、ご質問がある議論を投稿することができます〜

おすすめ

転載: blog.csdn.net/Java__xiaoze/article/details/94743987