単例モードコード分析


Singletonモードの主な役割はJavaアプリケーションにおいて、クラスクラスクラスクラスの一つのインスタンスだけが存在することを保証することである。
一般的なSingletonパターンにはいくつかの種類があります。
最初の形式: クラスを定義して、その構造関数はprvateのもので、staticのprvateのこのクラスの変数があります。クラス初期化の時には、publicのgetInstance方法を通じてその参照を取得し、その後、その中の方法を呼び出します。
public class Singleton {
private Singleton(){}
      //             ,      ?
      //    private       
      private static Singleton instance = new Singleton();
      //             class     ,        
      public static Singleton getInstance() {
        return instance;   
      } 
    } 
    第二の形式: 
public class Singleton { 
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //           ,           ,          
  //       ,     !
  if (instance==null)
    instance=new Singleton();
return instance;   } 
} 
上の二つの中にはそれぞれ長所があります。具体的にどのように使うかを見てください。
第一の形式はもっと安全だと思われます。 
追加
/**
 *     
  * @className: Singleton
  * @description:
  * @author: singleton-zw
  * @createDate: 2016 3 4 -  3:19:07
  * @updateAuthor:
  * @updateDate:
  * @updateDesc:
  * @version: v1.0
  * @Copyright (c)-2016
 */
//  ,  :    lazy loading   
public class Singleton {
	
	private static Singleton singleton = new Singleton();

	private Singleton() {
	}
	public static Singleton getInstance(){
		return singleton;
	}
}

//  ,     
class SingletonA{
	private static SingletonA a;
	private SingletonA() {}
	
	public static SingletonA getInstanceA(){
		if(a==null) return a = new SingletonA();
		return a;
	}
}
/**
 *   ,《Effective Java》         ,  :            ,                  
 */
enum EnumSingleton{
    INSTANCE;
    public void doSomeThing(){
    }
}

/**
 *         :            INSTANCE,        ,  Lazy loading
 */
class InternalSingleton{
    private static class SingletonHolder{
        private final static  InternalSingleton INSTANCE=new InternalSingleton();
    }   
    private InternalSingleton(){}
    public static InternalSingleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

/**
 *      ,           
 */
class LockSingleton{
    private volatile static LockSingleton singleton;
    private LockSingleton(){}

    public static LockSingleton getInstance(){
        if(singleton==null){
            synchronized(LockSingleton.class){
                if(singleton==null){
                    singleton=new LockSingleton();
                }
            }
        }
        return singleton;
    }
     
}