JAVA設計モード-単例モード


一、設計紹介1、設計モードとは何ですか.デザインパターン(Design pattern)は、繰り返し使用され、多くの人が知っている、分類編目された、コード設計経験の総括である.設計モードを使用するのは、コードを再利用し、コードを他人に理解されやすくし、コードの信頼性を保証するためです.1994年、4人の著者:Erich Gamma、Richard Helm、Ralph JohnsonとJohn Vlissidesは「設計モード-再利用可能な対象向けソフトウェア要素」と題した図書を発表し、ソフトウェア開発において設計モードの概念を切り開いた.
2、       ?
     :        ,                 。
     :                   。
     :        ,        。

二、設計モードの詳細解1.クラスにインスタンスが1つしかないことを確認し、グローバル・アクセス・ポイントを提供することを定義します.単例モードは典型的な3つの特徴を備えている:1、1つの例しかない.2、自己インスタンス化.3、グローバルアクセスポイントを提供する.単一モードの適用シーン:servlet、springMVC、接続プール、スレッドプール、列挙.単例の利点:メモリを節約し、再利用し、管理を容易にする.欠点:スレッドセキュリティ問題の一例の作成方法:1.餓漢式:クラスが初期化されると、すぐにオブジェクトがロードされ、スレッドは生まれつき安全で、呼び出し効率が高い.相対的にメモリを占める
//*餓漢式*/public class Demo 1{//作成オブジェクトを初期化し、呼び出し効率は高いが、このオブジェクトが使用されないとメモリprivate static final Demo 1 d 1=new Demo 1();//初期化構造方法private Demo 1(){}//イメージ取得に同意する方法public static Demo 1 getInstands(){return d 1;}
2.   :     ,       ,             。     。

/*怠け者*/public class Demo 2{private static Demo 2 d 2;//私有化構造private Demo 2()/効率が低く、スレッドが安全ではなく、public static synchronized Demo 2 getInstance(){if(d 2==null){d 2=new Demo 2()}return d2; } }3.静的内部クラス:怠け者式と餓漢式の利点を組み合わせて、本当に必要なときにロードされ、ロードクラスはスレッドが安全である4.列挙単例:列挙を用いて単例を実現し、実現が簡単で、効率が高く、列挙自体が単例である.public class Demo3 { private Demo3(){} public static Demo3 getInstance(){ return SingletonEnum.INSTANCE.getInstance(); } static enum SingletonEnum{ INSTANCE; private Demo3 d3; private SingletonEnum(){ d3 = new Demo3(); } public Demo3 getInstance(){ return this.d3; } } public static void main(String[] args) { Demo3 demo1 = Demo3.getInstance(); Demo3 demo2 = Demo3.getInstance(); System.out.println(demo1 == demo2); } }5.二重検出ロック(推奨しない)public class Demo 4{private Demo 4(){}private static Demo 4 volatile d 4;public Demo 4 getInstance(){if(d 4==null){synchronized(Demo 4.class){if(d 4=null){d 4=new Demo 4();}}return d4; } }注意:二重検出では再ソートの問題が発生する可能性があります.JDKでは、JAVA言語が順序内部の順序化の意味を維持するために、つまりプログラムの最終的な実行結果が単一スレッドの厳密な意味の順序化環境で実行される結果と一致することを保証するために、プログラム命令の実行順序がコードの順序と一致しない可能性があります.このプロセスを命令の再ソートと呼ぶ.命令の順序付けの意義は:JVMはプロセッサの特性によって、十分に多段キャッシュを利用して、マルチコアなどは適当な命令の順序付けを行って、プログラムに業務の運行を保証する同時に、十分にCPUの実行の特徴を利用させて、最大の発揮の機械の性能!Volatileタイプの変数はレジスタにキャッシュされない(レジスタ内のデータは現在のスレッドのみがアクセス可能)、またはCPUに対して非表示の他の場所では、毎回対応するデータをホストメモリに読み込む必要がある.これにより、変数の変更のたびに、他のスレッドも表示されることが保証され、自分のスレッドのローカル変数だけを変更するのではなく、happens-before発則では、1つのvolatile変数に対して書き込み操作を行った後、その後の任意の読み取り操作にこの書き込み操作の結果が表示されます.JAva同時並べ替え推奨ブログ:https://www.cnblogs.com/longshiyVip/p/5211476.html