シングルトン
シングルトン(Singletonパターン)は、Javaのデザインパターンの最も簡単なの一つです。デザインパターンのこのタイプのオブジェクトを作成するための最良の方法を提供し、スキーマを作成します属します。
このモデルは、単一のオブジェクトが作成されていることを保証しながら、独自のオブジェクトを作成するための責任がある単一のクラスが含まれます。このクラスは、オブジェクトが直接アクセスできる、オブジェクトクラスのインスタンスにアクセスするための唯一の方法を提供します。
注意:
-
一つだけシングルトンクラスのインスタンス。
-
シングルトンクラスは、独自のインスタンスを作成する必要があります。
-
シングルトンクラスは、他のすべてのオブジェクトにこの例を提供しなければなりません。
入門
意図:クラスのインスタンスを1つだけ確実にし、それをアクセスするためのグローバルアクセスポイントを提供します。
主に解決するために:頻繁に作成し、破壊するために使用グローバルクラスを。
解決方法:その後、作成されていない場合には、返された場合、システムはすでに、この単一のケースを持っているかどうかを判断します。
キーコード:コンストラクタがプライベートです。
応用例:このようHibernateのSessionFactoryのように、彼は、プロキシデータストレージ源として機能し、Sessionオブジェクトを作成するための責任があります。SessionFactoryの軽量ではないが、通常の状況下では、プロジェクトは通常、それはSingletonパターンを使用しますが、唯一のSessionFactory十分が必要です
使用する:1、固有のシリアル番号の生産を必要とします。2、WEBカウンターは、常に、データベースリガの先天的キャッシュされた単一の例をリフレッシュする時間がありません。図3に示すように、物体がニーズは、データベースなどのI / O接続などのリソースの過剰消費を作成します。
シングルトンパターンのいくつかの実装
1、空腹中国のタイプ(静的定数)
コード例:
public class SingletonDemo1 {
private final static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1(){}
public static SingletonDemo1 getInstance(){
return instance;
}
}
遅延初期化はされている:いいえ
マルチスレッドセーフである:はい
難易度を実現:簡単に
説明:一般的に使用されるこの方法ではなく、発生しやすいゴミオブジェクト。
長所:ロックされていない、効率が向上します。
短所:クラスがメモリを無駄にロードされたときに初期化。
これは、classloderメカニズムに基づいてクラスのロードは、シングルトンモードでそれらのほとんどは、getInstanceメソッドを多数呼び出しているされているが、それは決定できない原因がありますが、同期の問題マルチスレッドは、しかし、クラスのインスタンスへのインスタンスが一度にロードされている回避明らかに、インスタンスの初期化遅延ロードの効果に達しなかった他の方法(または他の静的メソッド)クラスローダをリードは、あります。
2、飢餓式(静的コードブロック)
コード例:
public class SingletonDemo {
private final static SingletonDemo instance;
private SingletonDemo(){}
static{
instance = new SingletonDemo();
}
public static SingletonDemo getInstance(){
return instance;
}
}
同じの最初の分析
3、怠惰な人間の(スレッドセーフ)
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
if(instance == null){
instance = new SingletonDemo();
}
return instance;
}
}
遅延初期化されている:はい
マルチスレッドセーフである:いいえ
簡単:難易度を達成
説明:これは最大の問題は、マルチスレッドをサポートしていません実現し、実装の最も基本的な方法です。同期一切ロックが存在しないので、それほど厳密にそれを言えば、シングルトンではありません。
明らかに、このよう遅延読み込み、適切にマルチスレッドでスレッドセーフ、できない作業を必要としません。
4、怠惰な式(同期方法)
public class SingletonDemo4 {
private static SingletonDemo4 instance;
private SingletonDemo4(){
}
public static synchronized SingletonDemo4 getInstance(){
if(instance == null){
instance = new SingletonDemo4();
}
return instance;
}
}
遅延初期化されている:はい
マルチスレッドセーフである:はい
簡単:難易度を達成
説明:この方法で良い遅延ロードを持って、マルチスレッドでうまく機能することができ、しかし、例99%が同期を必要としない、非常に低い効率です。
長所:最初の呼び出しが初期化されたが、メモリを無駄にしないようにします。
短所:シングルケースを確実にするために、同期ロックする必要がありますが、ロックは、効率に影響を与えます。
パフォーマンスのgetInstance()アプリケーションが(あまり頻繁に使用している)重要ではありません。
5、怠惰な式(シンクブロック)
public class SingletonDemo5 {
private static SingletonDemo5 instance;
private SingletonDemo5(){
}
public static SingletonDemo5 getInstance(){
if(instance == null){
synchronized(SingletonDemo5.class){
instance = new SingletonDemo5();
}
}
return instance;
}
}
図6に示すように、被写体の二重ロック/ロックダブルチェック(DCL、即ち、ダブルチェックロック)
public class SingletonDemo6 {
private static SingletonDemo6 instance;
private SingletonDemo6(){
}
public static SingletonDemo6 getInstance(){
if(instance == null){
synchronized(SingletonDemo6.class){
if(instance == null){
instance = new SingletonDemo6();
}
}
}
return instance;
}
}
遅延初期化されている:はい
マルチスレッドセーフである:はい
難易度を実現:より複雑な
説明:このデュアルモードロック機構、および安全なマルチスレッドには、高い性能を維持することができます。
パフォーマンスのgetInstance()は、アプリケーションにとって非常に重要です。
図7に示すように、レジスタベース/静的内部クラス
public class SingletonDemo7 {
private SingletonDemo7(){
}
private static class SingletonInstance {
private static final SingletonDemo7 INSTANCE = new SingletonDemo7();
}
public static synchronized SingletonDemo7 getInstance(){
return SingletonInstance.INSTANCE;
}
}
遅延初期化されている:はい
マルチスレッドセーフである:はい
一般:難易度を実現
説明:このメソッドは、同じ効果を得ることができ、二重ロックモードをチェックしますが、実装が簡単です。遅延を使用して静的フィールドの初期化は、このモードではなく、二重ロック検出モードを使用すべきです。この実施形態は、静的なフィールドに適用される遅延は、インスタンスのフィールドを初期化するために必要な場合、二重ロック検出モードを使用することができます。
このように、同じ利点classloder機構が初期化インスタンスにその一つだけスレッドを確保するために、それは今である第三の方法が異なっている:長いシングルトンクラスは、インスタンスがインスタンス化されロードされると最初の3つの方法が(遅延ロードに達していません効果)が、このアプローチは、シングルトンクラスロードされ、インスタンスが初期化されなくてもよいです。SingletonInstanceクラスがアクティブに使用されていないので、唯一のgetInstanceメソッドを呼び出すことはインスタンス化インスタンスにSingletonInstanceローディングクラスを表示されたときに表示。あなたは、インスタンスはリソースを消費するインスタンス化した場合、想像し、その一方、クラスはシングルトン、シングルトンクラスをインスタンス化されるときに、彼らが主導権をも可能にするために、他の場所で使用することができることを保証することはできませんので、ロードしたくない、遅延読み込みにそれをしたいですロードされ、明らかに不適切なインスタンス化インスタンスに、この時間。今回は、方法の最初の3種類に比べて、このように、それは非常に合理的です。
8、列挙
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
遅延初期化は、次のとおりです。No
マルチスレッドセーフである:はい
簡単:難易度を達成
説明:この実装は、広く採用されていないが、これは、シングルモードの実施例を実現するための最良の方法です。これは、よりコンパクトな、絶対の複数のインスタンスを防止するための自動サポートシリアル化メカニズムです。
このアプローチは、それがマルチスレッド同期の問題を避けることができるだけでなく、効果的なJavaの作成者ジョシュ・ブロッホ方法を提唱するだけでなく、自動的に絶対に複数のインスタンス化を防ぐため、直列化復元は、新しいオブジェクトを再作成を防止するために直列化メカニズムをサポートしています。しかし、この方法でのみ書き込みが実際には、ほとんど使用されない、助けることはできませんが、不思議な感じ、JDK1.5後に列挙型のプロパティに参加しました。
反射によってプライベートコンストラクタを呼び出すために攻撃しません。