javaの単一の例のモードと方法の総括を詳しく説明します。
javaデザインモード--単一例モード
一例の設計モード
Singletonは、あるクラスがSingletonモードを採用することを意味する作成型のモードであり、このクラスが作成された後に、外部へのアクセスのための一例のみが生成され、グローバルなアクセスポイントが提供される。
核心知識点は以下の通りです。
(1)一例の設計モードを採用する類の構造方法を私有化する(prvate修飾を採用する)。
(2)このクラスの例示的なオブジェクトは、その内部で生成され、prvate staticタイプにカプセル化される。
(3)クラスのインスタンスに戻る静的方法を定義する。
長所は、書くのが簡単で、多スレッド同期の問題がなく、synchronizedによる性能問題を回避したことです。
欠点は、クラスSingleton Testがロードされると、staticのinstanceが初期化され、静的変数が作成されてメモリ空間が割り当てられ、その後、このstaticのinstanceオブジェクトがこのメモリを占めています。カテゴリがアンインストールされると、静的変数が破壊され、占有されたメモリが解放されます。そのため、ある特定の条件でメモリが消費されます。
利点は、書き込みが比較的簡単で、クラスSingleton Testがロードされているとき、静的変数staticのinstanceが作成されていなくて、メモリ空間が割り当てられています。get Instanceメソッドが最初に起動されたときにinstance変数を初期化し、メモリを割り当てるので、特定のストリップでメモリが節約されます。
欠点は、同時環境において複数のSingleton Testの例が発生する可能性が高いことである。
利点は、マルチスレッドアクセスを回避するために、synchronizedキーを使用すると、複数のSingleton Testが出現するということです。
欠点は、同期方法が頻繁に起動する場合、効率がやや低いことです。
(実際には、Java反射機構によってprvateタイプの構造方法を実装することができ、このときは基本的にすべてのJava単一例が無効になる。反射についてはこのスレでは議論しませんが、デフォルトでは反射なし、よくある面接シーンです。
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。
一例の設計モード
Singletonは、あるクラスがSingletonモードを採用することを意味する作成型のモードであり、このクラスが作成された後に、外部へのアクセスのための一例のみが生成され、グローバルなアクセスポイントが提供される。
核心知識点は以下の通りです。
(1)一例の設計モードを採用する類の構造方法を私有化する(prvate修飾を採用する)。
(2)このクラスの例示的なオブジェクトは、その内部で生成され、prvate staticタイプにカプセル化される。
(3)クラスのインスタンスに戻る静的方法を定義する。
/**
*
* : ,
*/
public class SingletonTest {
//
private SingletonTest() {
}
// , Static final
private static final SingletonTest instance = new SingletonTest();
//
public static SingletonTest getInstancei() {
return instance;
}
}
方法の一つは伝説の餓漢モードです。長所は、書くのが簡単で、多スレッド同期の問題がなく、synchronizedによる性能問題を回避したことです。
欠点は、クラスSingleton Testがロードされると、staticのinstanceが初期化され、静的変数が作成されてメモリ空間が割り当てられ、その後、このstaticのinstanceオブジェクトがこのメモリを占めています。カテゴリがアンインストールされると、静的変数が破壊され、占有されたメモリが解放されます。そのため、ある特定の条件でメモリが消費されます。
/**
*
* : ,
*
*/
public class SingletonTest {
// ( new SingletonTest() )
private SingletonTest() {
}
// SingletonTest ( , final )
private static SingletonTest instance;
// ( SingletonTest, , )
public static SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
方法の2は伝説の中の満腹モードです。利点は、書き込みが比較的簡単で、クラスSingleton Testがロードされているとき、静的変数staticのinstanceが作成されていなくて、メモリ空間が割り当てられています。get Instanceメソッドが最初に起動されたときにinstance変数を初期化し、メモリを割り当てるので、特定のストリップでメモリが節約されます。
欠点は、同時環境において複数のSingleton Testの例が発生する可能性が高いことである。
/**
*
* : ,
*
*/
public class SingletonTest {
// ( new SingletonTest() )
private SingletonTest() {
}
// SingletonTest ( , final )
private static SingletonTest instance;
// ( SingletonTest, synchronized , )
public static synchronized SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
方法の3は方法の2の簡単な最適化です。利点は、マルチスレッドアクセスを回避するために、synchronizedキーを使用すると、複数のSingleton Testが出現するということです。
欠点は、同期方法が頻繁に起動する場合、効率がやや低いことです。
/**
*
*
*
*
*/
public class SingletonTest {
//
private SingletonTest() {
}
// ( , final , volatile instance , instance , )
private static volatile SingletonTest instance;
// ,
public static SingletonTest getIstance() {
// ( ,instance null , , )
if (instance == null) {
// ( , , , )
synchronized (SingletonTest.class) {
// , instance
if (instance == null) {
instance = new SingletonTest();
}
}
}
return instance;
}
}
方法4は一例モードの最適な実現である。メモリ占有率、効率、スレッド安全、マルチスレッド動作原子性。 (実際には、Java反射機構によってprvateタイプの構造方法を実装することができ、このときは基本的にすべてのJava単一例が無効になる。反射についてはこのスレでは議論しませんが、デフォルトでは反射なし、よくある面接シーンです。
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。