天天看點

Java單例模式(Singleton)的五種實作目前缺枚舉類實作:

目前缺枚舉類實作:

package pattern;

public class SingleInstance{
      private static SingleInstance sInstance = new SingleInstance();
      private SingleInstance(){}
      public static SingleInstance getInstance(){
         return sInstance;
      }
      public static void main(String[] arg) {
          System.out.println(SingleInstance.getInstance());
          System.out.println(SingleInstance.getInstance());
          System.out.println(SingleInstance2.getInstance());
          System.out.println(SingleInstance2.getInstance());
          System.out.println(SingleInstance3.getInstance());
          System.out.println(SingleInstance3.getInstance());
          System.out.println(SingleInstance4.getInstance());
          System.out.println(SingleInstance4.getInstance());
          System.out.println(SingleInstance5.getInstance());
          System.out.println(SingleInstance5.getInstance());
      }
}

class SingleInstance2 {
      private static SingleInstance2 sInstance;
      private SingleInstance2(){}
      public static SingleInstance2 getInstance(){
        if( null == sInstance){
            sInstance = new SingleInstance2();
        }
        return sInstance;
      }
      /* 上述的代碼在多個線程密集調用getInstance時,存在建立多個執行個體的可能。
       * 比如線程A進入null == sInstance這段代碼塊,而在A線程未建立完成執行個體時,
       * 如果線程B也進入了該代碼塊,必然會造成兩個執行個體的産生。
       * 
       */
}

class SingleInstance3 {
    private static SingleInstance3 sInstance;
    private SingleInstance3() {}
    public static synchronized SingleInstance3 getInstance(){
      if (null == sInstance){
         sInstance = new SingleInstance3();
      }
    return sInstance;
    }
}
/* Volatile是輕量級的synchronized,它在多處理器開發中保證了共享變量的“可見性”。
 * 可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。
 * 使用volatile修飾sInstance變量之後,可以確定多個線程之間正确處理sInstance變量。
 * 
 */
class SingleInstance4 {
       private static volatile SingleInstance4 sInstance;
       private SingleInstance4(){}
       public static SingleInstance4 getInstance(){
          if(null==sInstance){
              synchronized(SingleInstance4.class){
                if(null == sInstance){
                   sInstance = new SingleInstance4();
                }
              }
          }
       return sInstance;
       }
    }

/* 在Java中,類的靜态初始化會在類被加載時觸發,我們利用這個原理,可以實作利用這一特性,
 * 結合内部類,可以實作如下的代碼,進行懶漢式建立執行個體。
 * 
 */
class SingleInstance5 {
      private SingleInstance5(){}
      public static SingleInstance5 getInstance() {
        return SingleInstanceHolder.sInstance;
      }
      private static class SingleInstanceHolder {
        private static SingleInstance5 sInstance = new SingleInstance5();
      }
    }