1 概要
シングルトン パターンにはいくつかの利点があります。
(1) 一部の大きなオブジェクトでは、特定のクラスがより頻繁に作成されるため、システムのオーバーヘッドが大きくなります。
(2) 新しい演算子が省略されるため、システム メモリの使用頻度が減り、GC 圧力が軽減されます。
(3) 取引所のコア取引エンジンなど、一部のクラスが取引プロセスを制御します。複数のクラスを作成できると、システムが完全に混乱してしまいます。
2 詳しい説明
シングルトン パターンを記述するには、次の 2 つの一般的に使用される方法があります。
2.1 お腹を空かせた中華風
アプリケーションが常にシングルトン パターンを作成して使用する場合、または作成および実行時の負荷がそれほど高くない場合は、プライベート静的変数を使用して事前にオブジェクトを作成できます。
次のようにコードをコピーします。
パッケージ org.scott.singleton;
/**
* @著者スコット
* @バージョン 2013-11-16
* @説明
*/
パブリック クラス Singleton1 {
private static Singleton1 uniqueInstance = new Singleton1();
プライベートシングルトン1(){
}
パブリック静的Singleton1 getInstance(){
uniqueInstance を返します。
}
}
この場合、JVM がこのクラスをロードすると、オブジェクトは初期化シーケンスに従って作成されます。同時に、JVM は、すべてのスレッドがこのシングルトン オブジェクトにアクセスする前に、このインスタンスを最初に 1 回だけ作成する必要があることを保証できます。
もちろん、静的内部クラスを使用して同じ機能を実行することもできます。
次のようにコードをコピーします。
パッケージ org.scott.singleton;
/**
* @著者スコット
* @バージョン 2013-11-16
* @説明
*/
パブリック クラス Singleton2 {
プライベート Singleton2() {
}
/**
* ここではシングルトンを維持するために内部クラスが使用されています
* */
プライベート静的クラス SingletonFactory {
プライベート静的 Singleton2 インスタンス = new Singleton2();
}
public static Singleton2 getInstance() {
SingletonFactory.instance を返します。
}
/**
* オブジェクトがシリアル化に使用される場合、シリアル化の前後でオブジェクトの一貫性が保たれることが保証されます。
* */
public Object readResolve() {
getInstance() を返します。
}
}
2.2 ダブルロック方式
「ダブルロック」はその名の通り2つのロックで、最初のロックは作成するインスタンスオブジェクトが作成されているかどうかを確認するために使用され、作成されていない場合は2番目のロックが同期に使用されます。
次のようにコードをコピーします。
パッケージ org.scott.singleton;
/**
* @著者スコット
* @バージョン 2013-11-16
* @説明
*/
パブリック クラス Singleton3 {
プライベート揮発性静的 Singleton3 uniqueInstance;
プライベート Singleton3(){
}
パブリック静的Singleton3 getInstance(){
if(uniqueInstance == null){
同期化(Singleton3.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton3();
}
}
}
uniqueInstance を返します。
}
}
パフォーマンス要件が比較的高い場合、この方法は作成時間を大幅に短縮できます。現在、この方法はシングルトンを作成する比較的一般的な方法でもあります。