いくつかの単例モードの書き方
1523 ワード
方法1:
Singletonを使用すると.createString()の実行結果は次のとおりです.
単例クラスは使用されていませんが、ロードされました.この問題を解決するために私たちは方法2を導入した.
方法2:
第2の方法は同期キーワードを用いて遅延ロード機能を実現したが、同期キーワードはsychronizedによって修飾されたコードに複数のスレッド同僚がアクセスすることを許さないため、マルチスレッドのプロジェクトでは方法1に及ばないことが予想される(ここでは自分で検証できる).
方法3:
Singleton 3では、Singleton 3がロードされると内部クラスはロードされず、getInstanceメソッドが呼び出されるとSingletonHolderクラスがロードされ、遅延ロードの機能が保証される内部クラスが使用される.
public class Singleton1 {
private Singleton1(){
System.out.print("Singleton1 created");
}
private static Singleton1 instance = new Singleton1();
public static Singleton1 getInstance(){
return instance;
}
public static void createString(){
System.out.print("String created");
}
}
Singletonを使用すると.createString()の実行結果は次のとおりです.
Singleton created
String created
単例クラスは使用されていませんが、ロードされました.この問題を解決するために私たちは方法2を導入した.
方法2:
public class Singleton2 {
private Singleton2(){
System.out.print("Singleton2 created");
}
private static Singleton2 instance = null;
public static sychronized Singleton2 getInstance(){
if (install == null){
instance = new Singleton2();
}
return instance;
}
}
第2の方法は同期キーワードを用いて遅延ロード機能を実現したが、同期キーワードはsychronizedによって修飾されたコードに複数のスレッド同僚がアクセスすることを許さないため、マルチスレッドのプロジェクトでは方法1に及ばないことが予想される(ここでは自分で検証できる).
方法3:
public class Singleton3 {
private Singleton(){
System.out.print("Singleton3 created");
}
private static class SingletonHolder {
private static Singleton3 instance = new Singleton3();
}
public static Singleton3 getInstance() {
return SingletonHolder.instance;
}
}
Singleton 3では、Singleton 3がロードされると内部クラスはロードされず、getInstanceメソッドが呼び出されるとSingletonHolderクラスがロードされ、遅延ロードの機能が保証される内部クラスが使用される.