JAVAパッケージ学習ノート3-単例モード

1702 ワード

単例モード(singleton):
  クラスにはインスタンスが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に複数のクラスローダがある