シングルトンデザインパターンは、私たちは通常、頻繁に使用される最も単純なモデル内のすべて、Singletonパターンは、しばしば私たちのスレッドプール、キャッシュ操作、キュー操作で使用されている、などです。
シングルトンは、クラスのインスタンスを作成し、クラスのインスタンスを作成することを目指して、私たちは、グローバルな静的変数を使用するか、または契約は、我々はSingletonパターンを使用する理由の一つの例としての役割を行うことができますか?
次は説明し、Singletonパターンの作成のプロセスを単一のケースのモデルを形成する方法で行ってきました。
シングルトンを形成する方法1、
我々は通常、我々はそれをインスタンス化のObjectClassのオブジェクトがある場合、オブジェクトは、新しいオブジェクトを作成し必要。
新しいのObjectClass()
あなたはクラスが公開されている場合は、別のインスタンスを再作成することができたObjectClass別のクラスを使用したい場合はときに、新しいによって使用されているし、我々は、オブジェクトを何度もインスタンス化することができます。
次に、どのように我々は、クラスは、我々は外部のインスタンス化にクラスを防ぐために、プライベートコンストラクタを使用することができ、秘密鍵を使用して、他のクラスのインスタンスでないことを確認します。
パブリッククラスのObjectClass { プライベートのObjectClass() { } }
その結果、我々はそれを使用することはできません、その後のObjectClassインスタンス化することはできません。我々はそれをインスタンス化する方法をそれ?
私たちは順番に、ObjectClassのインスタンスの内部メソッドを使用することができますので、我々は唯一の外部からのアクセスに対して、プライベートコンストラクタの内部にアクセスすることができますので、この方法は、静的なの、この方法に設定されます。
これは返されるオブジェクトは常にオブジェクトが最初に作成されていることを保証するために行われた後、我々は作成されたオブジェクトを返すために作成された場合、オブジェクトは、すぐに作成するために私たちを作成しなかった場合は、インスタンス化されたオブジェクトを格納するプライベート静的オブジェクトを使用します。
パブリッククラスのObjectClass { プライベート静的のObjectClassシングルトン。 プライベートのObjectClass() { } パブリック静的ObjectClassのGetSingletone() { IF(シングルトン== NULL) { シングルトン=新しいObjectClassの()。 } 戻りシングルトン。 } }
ここでは、単一の実施の形態は、単一のスキーマ定義の例を形成しています。
シングルトン:クラスのインスタンスを1つだけ確実に、そしてグローバルなアクセスポイントを提供。
2、マルチスレッドリードシングルトンの問題
マルチスレッドテストリターンをシングルトンオブジェクトを有効にします
クラスプログラム { 静的な無効メイン(文字列[] args) { ため(INT I = 0、I <10; I ++) { TestSingleton()。 } Console.ReadKey()。 } パブリック静的ボイドTestSingleton() { Task.Factory.StartNew(新しいアクション(()=> { VAR HC = ObjectClass.GetSingletone()メソッドGetHashCode(); Console.WriteLineを(HC); }))。 } }
行ってテストに示したように、私は10件のスレッドがシングルトンオブジェクトを取得し、オブジェクトのハッシュコードを印刷し始めます。試験は、矛盾のハッシュコードを発見し、証明の目的は、単一の例戻るだけではありません。
(シングルトン== NULL)場合にマルチスレッド動作が同時にこの時間変数がまだインスタンス化されていない場合、シングルトンインスタンス化コードに複数のスレッドを有していてもよいかを決定するために入力することができるため、返されていないオブジェクト・インスタンス同じ。
図3に示すように、マルチスレッドシングルトンの問題を解決するために
変数を検査した場合の問題に対するマルチスレッドのリードは、戦いが問題をチェックするので、我々は解決策の二つのタイプを持つことができます。
インスタンスを作成する①「熱心」、インスタンス化の練習を遅らせることはありません
熱心なインスタンス化がこのようにして作成されたプログラムのシングルトンオブジェクトの運用段階を確保し、静的初期化子内のオブジェクトを作成することで、裁判官であれば除去。
パブリッククラスのObjectClass { プライベート静的ObjectClassのシングルトン=新しいのObjectClass(); プライベートのObjectClass() { } パブリック静的ObjectClassのGetSingletone() { 戻りシングルトン。 } }
② ロック
オブジェクト一つだけスレッドの動作を作成するために、我々は再びオブジェクトコード、改革GetSingletone法を作成するための処理をロック。
パブリッククラスのObjectClass { プライベート静的ObjectClassのシングルトン=新しいのObjectClass(); プライベート静的オブジェクトlockObjは、新しいオブジェクトを()=; プライベートのObjectClass() { } パブリック静的ObjectClassのGetSingletone() { ロック(lockObj) { IF(シングルトン== NULL) { シングルトン=新しいObjectClassの()。 } } シングルトン返します。 } }
パフォーマンスの一定の損失をロックし、高いパフォーマンス要件にあなたのシステムならば、我々は最適化への道があるに対処する必要がロック:ダブルロックをチェック
パブリック静的ObjectClassのGetSingletone() { IF(シングルトン== NULL) { ロック(lockObj) { IF(シングルトン== NULL) { シングルトン=新しいObjectClassの()。 } } } シングルトン返します。 }
シングルトンオブジェクトが後に作成されている場合は、実行時に、ロックをチェックダブルその後、複数のスレッドを使用しないで再入力することにより、ロックによるパフォーマンスの損失を低減するロックコードセグメントを。
その後、我々は50のスレッドを有効にし、あなたはハッシュコード出力が一貫して見ることができ、テスト波に来ます。
4、要約
私たちは、グローバルまたはに背を話し始めた私たちは、グローバル変数の問題を引き起こすの契約または乱用に従ってその全員を保証することはできませんが合意されているが、我々は、それを開発しているので、一つの例問題を解決することに合意していない理由。
シングルトンパターンは、もちろん、我々はまた、可能性の深い理解を使用する方法の問題を解決するために、それを必要とシングルトンを、乱用されている、より良い自己管理契約することができます。
デザインモードは、機械的に適用されるべきではなく、公正使用に合わせてシーンが必要なとき。
シングルトンパターンは比較的簡単ですが、私たちは多くの問題を参照してください分析は、我々はより良い分析をより有効に利用するようにする必要がありますが、私はこのブログあなたにいくつかの助けを願っています。