JAVAパッケージ学習ノート3-単例モード
1702 ワード
単例モード(singleton):
クラスにはインスタンスが1つしかありません.(データベースへのアクセス効率の向上など)
2つ: 餓漢 怠け者
クラスにインスタンスが1つしかないことを保証するにはどうすればいいですか?どのように外部クラスをnewできないようにするか---構造方法を私有にする.次のようになります.
では、これは本当に1つの例しか保証できませんか?
明らかにs 1、s 2は同じSingletonではありません.
では、いったいどうすればいいのでしょうか.次のコードを見てください.
これにより、Instranceコードを呼び出すたびに静的singletonが返されるのは明らかです.
この方法を餓漢式と呼ぶ.次に、怠け者という単例モデルについてもお話しします.
まず、次のコードを見てください.
まずstatic singletonを空に宣言し、使用するときに作成します.この方法は怠け者式と呼ばれています.ここでは、スレッドセキュリティの問題に注意する必要があります.
マルチスレッドがインスタンスにアクセスする必要がある場合、複数のスレッドがInstance()メソッドを呼び出すと、2つのインスタンスの作成などの問題が発生する可能性があります.ここでは、スレッドロックsynchronizedを追加します.次のようになります.
注意:
複数のJVMシステムの分散システムにおいて
1つのJVMに複数のクラスローダがある
クラスにはインスタンスが1つしかありません.(データベースへのアクセス効率の向上など)
2つ: 餓漢 怠け者
クラスにインスタンスが1つしかないことを保証するにはどうすればいいですか?どのように外部クラスをnewできないようにするか---構造方法を私有にする.次のようになります.
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){//
return new Singleton();
}
}
では、これは本当に1つの例しか保証できませんか?
Singleton s1 = Singleton.getInstance();
Singleton s1 = Singleton.getInstance();
明らかにs 1、s 2は同じSingletonではありません.
では、いったいどうすればいいのでしょうか.次のコードを見てください.
public class Singleton{
private Singleton(){
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){//
return singleton;
}
}
これにより、Instranceコードを呼び出すたびに静的singletonが返されるのは明らかです.
この方法を餓漢式と呼ぶ.次に、怠け者という単例モデルについてもお話しします.
まず、次のコードを見てください.
public class Singleton{
private Singleton(){
}
private static Singleton singleton = null;
public static Singleton getInstance(){//
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
まずstatic singletonを空に宣言し、使用するときに作成します.この方法は怠け者式と呼ばれています.ここでは、スレッドセキュリティの問題に注意する必要があります.
マルチスレッドがインスタンスにアクセスする必要がある場合、複数のスレッドがInstance()メソッドを呼び出すと、2つのインスタンスの作成などの問題が発生する可能性があります.ここでは、スレッドロックsynchronizedを追加します.次のようになります.
public class Singleton{
private Singleton(){
}
private static Singleton singleton = null;
public synchronized static Singleton getInstance(){//
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
注意:
複数のJVMシステムの分散システムにおいて
1つのJVMに複数のクラスローダがある