シングルトンパターンの目的は、クラスに1つのインスタンスしかないことを確認することであり、グローバルアクセスポイントを提供することです。他の労働者が私たちのクラスをインスタンス化するのを防ぐために、
このクラスのユニークなコンストラクターを作成し、コンストラクターの目に見えるものをプライベートに設定できます。他の非プライベートコンストラクターを作成した場合、またはクラスについてまったく言及していないことは注目に値します。
コンストラクターの場合、他の人はまだクラスをインスタンス化できます。シングルトンオブジェクトを事前に作成したくない場合は、Singletonオブジェクトを初めて使用するまで待つことができます。つまり、
ラグ初期化。シングルトンオブジェクトの初期化を遅らせる理由は2つあります。
1.静的初期化時間に、Singletonオブジェクトの初期化方法に関する十分な情報がないかもしれません。
2.ラグ初期化シングルトンを選択する目的は、特に特定の特定のセッションでこのシングルトンが必要ないアプリケーションで、データベース接続などのリソースを待つことです。
シングルトンがマルチスレッド環境で初期化されている場合、複数のスレッドが同じ時間に初期化されないように注意する必要があります。
通常、シングルトンパターンはJava言語で構築されています。
Lazy Way:初めて使用されたときに構築されるグローバルなSingletonインスタンスを指します。遅延初期化。
Hungry Man Method:クラスのロード中に構築されているグローバルな単一インスタンスを指します。緊急の初期化。
1。空腹の中国のシングルトン
パブリッククラスSingleton1 {private singleton1(){} //独自のインスタンスを内部で定義します。 //これはプライベートであることに注意してください。 private static singleton1インスタンス= new Singleton1(); /** * // ** *このクラスへの外部アクセスの静的方法は、 * @return */public static singleton1 getInstance(){return instance; }}2。怠zyなシングルトンクラス
パブリッククラスSingleton2 {private static singleton2インスタンス= null; /*** // ***この方法は、上記と比較して改善されています。毎回オブジェクトを生成する必要はありませんが、初めて *使用時にインスタンスを生成すると、効率が向上します! * @return */ public static singleton2 getInstance(){if(instance == null)instance = new Singleton2();インスタンスを返す; }}以下は、主なマルチスレッドの問題です。怠zyなシングルトンでは、シングルスレッドに問題はありませんが、マルチスレッドの場合、2つ以上のSingletion2インスタンスがある場合があります。
例:スレッド1がインスタンス== nullが真であると判断する場合、新しい操作をスキャンするとき、新しい操作を実行する前、新しい操作を実行した後、スレッド2は判断操作を実行するだけで、インスタンスはまだnullです。したがって、スレッド2は新しい操作も実行します。など、高い並行性の下では、Singletion2の2つ以上のインスタンスがある場合があります。明らかに、これは間違っています。
したがって、次のようにコードを変更します。
パブリッククラスSingleton3 {private static singleton3インスタンス= null; /*** // ***この方法は、上記と比較して改善されています。毎回オブジェクトを生成する必要はありませんが、初めて *使用時にインスタンスを生成すると、効率が向上します! *マルチスレッドのエラーを回避するために、同期フラグが追加されました * @return */ public static同期Singleton3 getInstance(){if(instance == null)instance = new Singleton3();インスタンスを返す; }}しかし、これは別の問題を引き起こします。メソッドは、インスタンスが取得されるたびに同期されます。明らかに、パフォーマンスは非常に影響を受けているため、次のようにコードを変更し続けます。
揮発性、同期を低コストで交換します
揮発性が同期よりも安いのはなぜですか?
同期のコストは、主にそのカバレッジ範囲によって決定されます。同期のカバレッジ範囲を減らすことができれば、プログラムのパフォーマンスを大幅に改善できます。
揮発性のカバレッジは、可変レベルのみです。したがって、その同期コストは非常に低いです。
揮発性の原則は何ですか?
揮発性のセマンティクスは、実際にプロセッサに私をワーキングメモリに入れないように指示することです。メインメモリに直接操作してください。 (詳細については、ワーキングメモリについてはJavaメモリモデルを参照してください)
したがって、マルチコアまたはマルチスレッドが変数にアクセスすると、それらは本質的に変数共有を実現するメインメモリを直接動作させます。
揮発性の利点は何ですか?
1。より大きなプログラムスループット
2。マルチスレッドを実装するコードが少ない
3.プログラムのスケーラビリティが向上しています
4.理解しやすく、学習コストが高すぎる必要はありません。
揮発性の欠点は何ですか?
1。問題が発生しやすい
2。設計は困難です
Volatileは、JDKにはバージョン1.5以上が必要です。
改善されたコードは次のとおりです(ダブルロックとも呼ばれます):
Public Class Singleton4 {private static Volatile Singleton4インスタンス; /*** // ***マルチスレッドアプリケーションとパフォーマンスの最適化を達成するためのダブルロック* @return*/public static singleton4 getInstance(){if(instance == null){synchlonized(singleton4.class){// 1 if(instance == null)// 2 inst = new singleton4(); // 3}} return instance; }}