java設計模式總結三:單例模式__設計模式

來源:互聯網
上載者:User
單例模式定義

    單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體。即一個類只有一個對象執行個體

    
單例模式的實現方式: 懶漢式實現,不過多線程下不安全

    public class Singleton {          private static Singleton instance;          private Singleton (){}          public static Singleton getInstance() {          if (instance == null) {              instance = new Singleton();          }          return instance;          }      }  
懶漢式實現2:安全執行緒(添加synchronied關鍵字)(然而遺憾的是多線程執行效率很低,大多數情況下不需要使用多線程)
    public class Singleton {          private static Singleton instance;          private Singleton (){}          public static synchronized Singleton getInstance() {          if (instance == null) {              instance = new Singleton();          }          return instance;          }      }  
餓漢式實現:安全執行緒(因為在類載入時就直接建立了該類的單例對象,所以不會因為多線程的原因而導致對象的不同,不過該實現方式顯然沒有實現lazy loading的效果)
    public class Singleton {          private static Singleton instance = new Singleton();          private Singleton (){}          public static Singleton getInstance() {          return instance;          }      }  
餓漢式變種(同第三種類似,不同的是初始化的順序)
    public class Singleton {          private Singleton instance = null;          static {          instance = new Singleton();          }          private Singleton (){}          public static Singleton getInstance() {          return this.instance;          }      }  
靜態內部類:(實現了lazy loading的效果,因為在外部類裝載的時候,靜態內部類還沒有被使用,當調用了該外部類的getInstance方法時才會裝載該靜態內部類,從而產生單例模式的該外部類執行個體)
    public class Singleton {          //外部類裝載的時候,在沒有調用getInstance方法之前該內部類是不會被裝載的,因此也實現了lazy loading的效果        private static class SingletonHolder {          private static final Singleton INSTANCE = new Singleton();          }          private Singleton (){}          public static final Singleton getInstance() {          return SingletonHolder.INSTANCE;          }      }  
枚舉:(用的少)

    
雙重檢驗鎖:安全執行緒程度最高的單例模式實現,不過並不能保證他在單一處理器或者多處理器電腦上正常運行,這歸咎於java平台的記憶體模型允許的所謂“無序輸入”

    public class Singleton {          private volatile static Singleton singleton;          private Singleton (){}          public static Singleton getSingleton() {          if (singleton == null) {              //以防多線程並發,對當前class進行鎖定            synchronized (Singleton.class) {              if (singleton == null) {                  singleton = new Singleton();              }              }          }          return singleton;          }      }  

    
單例模式使用情境:

    串連資料庫的時候就使用的是單例模式

    Servlet容器就使用的單例模式

    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.