この記事では主に Java シングルトン モードの例の詳細な説明に関する関連情報を紹介します。この記事がこの部分の内容を完全に理解して習得するのに役立つことを願っています。必要な方は
の例の詳細な説明を参照してください。 Java シングルトン モード
コンセプト:
シングルトン パターンは Java の一般的な設計パターンです。シングルトン パターンには、遅延スタイル シングルトン、ハングリー スタイル シングルトン、および登録スタイル シングルトンの 3 種類があります。
シングルトン パターンには次の特徴があります:
1. シングルトン クラスはインスタンスを 1 つだけ持つことができます。
2. シングルトンクラスは独自の一意のインスタンスを作成する必要があります。
3. シングルトンクラスは、このインスタンスを他のすべてのオブジェクトに提供する必要があります。
シングルトン パターンは、クラスがインスタンスを 1 つだけ持つことを保証し、クラス自体をインスタンス化し、このインスタンスをシステム全体に提供します。コンピュータ システムでは、スレッド プール、キャッシュ、ログ オブジェクト、ダイアログ ボックス、プリンタ、グラフィック カード ドライバ オブジェクトはシングルトンとして設計されることがよくあります。これらのアプリケーションはすべて、多かれ少なかれリソース マネージャーの機能を備えています。各コンピュータには複数のプリンタを搭載できますが、2 つの印刷ジョブが同時にプリンタに出力されることを防ぐために、存在できるプリンタ スプーラは 1 つだけです。各コンピュータは複数の通信ポートを持つことができ、システムはこれらの通信ポートを集中管理して、1 つの通信ポートが 2 つの要求によって同時に呼び出されないようにする必要があります。つまり、シングルトン モードを選択する目的は、矛盾した状態を回避し、長期的なポリシーを回避することです。
まず、古典的なシングルトンの実装を見てみましょう。
public class Singleton { private static Singleton uniqueInstance = null; private Singleton() { // Exists only to defeat instantiation. } public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } // Other methods... }
Singleton は、コンストラクターをプライベートに制限することで、クラスが外部でインスタンス化されるのを回避します。同じ仮想マシンのスコープ内では、Singleton の唯一のインスタンスには getInstance() メソッドを通じてのみアクセスできます。 (実際、Java リフレクション メカニズムを通じてプライベート コンストラクターを使用してクラスをインスタンス化することができます。これにより、基本的にすべての Java シングルトン実装が無効になります。この問題についてはここでは説明しません。リフレクション メカニズムは存在しないものとして考えてみましょう。)
しかし、上記の実装ではスレッドの安全性の問題が考慮されていません。いわゆるスレッド セーフティとは、コードが配置されているプロセスで複数のスレッドが同時に実行されている場合、これらのスレッドがこのコードを同時に実行できることを意味します。各実行の結果がシングルスレッド実行の結果と同じであり、他の変数の値が予想どおり同じである場合、それはスレッドセーフです。言い換えれば、クラスまたはプログラムによって提供されるインターフェイスは、スレッドのアトミックな操作であるか、複数のスレッド間の切り替えによってインターフェイスの実行結果があいまいになることはありません。これは、同期の問題を考慮する必要がないことを意味します。明らかに、上記の実装はスレッド セーフの要件を満たしておらず、複数のシングルトン インスタンスが同時環境に出現する可能性があります。
public class TestStream { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //该类只能有一个实例 private TestStream(){} //私有无参构造方法 //该类必须自行创建 //有2种方式 /*private static final TestStream ts=new TestStream();*/ private static TestStream ts1=null; //这个类必须自动向整个系统提供这个实例对象 public static TestStream getTest(){ if(ts1==null){ ts1=new TestStream(); } return ts1; } public void getInfo(){ System.out.println("output message "+name); } } /** * */ public class TestMain { public static void main(String [] args){ TestStream s=TestStream.getTest(); s.setName("张孝祥"); System.out.println(s.getName()); TestStream s1=TestStream.getTest(); s1.setName("张孝祥"); System.out.println(s1.getName()); s.getInfo(); s1.getInfo(); if(s==s1){ System.out.println("创建的是同一个实例"); }else if(s!=s1){ System.out.println("创建的不是同一个实例"); }else{ System.out.println("application error"); } } }
実行結果:
张孝祥 张孝祥 output message 张孝祥 output message 张孝祥 创建的是同一个实例
結論: この結果から、シングルトン パターンは、その機能に関係なく、オブジェクトへの唯一のアクセス ポイントをオブジェクト指向アプリケーションに提供することがわかります。を実装すると、アプリケーション全体がすべてインスタンス オブジェクトを共有します。
1. ハングリースタイルのシングルトンクラス
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { //私有的默认构造子 private Singleton1() {} //已经自行实例化 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
2. レイジースタイルのシングルトンクラス
以上がJavaシングルトンパターンの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。