java單例模式

來源:互聯網
上載者:User

標籤:利用   demo   turn   單例模式   判斷   nbsp   一句話   資料庫連接   使用情境   

之前只知道單例模式有兩種:懶漢式和餓漢式,後來因為看到一句話,如果你將建構函式私人化,別人使用反射,這個時候怎麼辦,所以就知道了第三種方式枚舉模式。然後今天又看到了靜態內部類式和雙重檢測鎖,今天就總結一下。

一、單例模式

(1)核心:保證只有一個執行個體,並提供一個訪問全域的訪問點。

(2)使用情境:

         Windows的工作管理員

   .Windows的資源回收筒

         項目中讀取設定檔,沒有必要每次都進行讀取。

         網站計數器

        日誌管理   

        資料庫連接池,等等

(3)優點

      使用單例只產生一個對象,減少系統的開銷,對於一個對象產生需要比較多的資源,如配置、產生依賴對象時,我們可以使用單例對象

      單例模式可以設定全域的訪問點,共用資源的訪問。

2.單例設計模式的實現方式

 (1)餓漢式:安全執行緒,調用效率高,但是不消極式載入

           a) 首先私人建構函式

           b) 使用私人得靜態變數建立一個方法

           c) 提供一個靜態方法訪問次對象

          它是一個安全執行緒的的模式,對象不是自己來建立,而是有一個對象等待使用,不需要同步,效率高。

         浪費資源,沒有消極式載入。

實現方式:

package kw.test.sjms;/* * 單例模式 *     餓漢式單例模式 *  */public class DemoEH {    private static DemoEH instance = new DemoEH();    private DemoEH() {}    public  static DemoEH getInstace()    {        return instance;    }}

 (2)懶漢式:安全執行緒,調用效率不高,但是,可以消極式載入

    ··· 使用的時候才去載入,但是需要使用synchronized

·   ··· 資源使用率高,但是效率不是很高。

     ···缺點:每次都需要同步,浪費資源。

實現方式:

package kw.test.sjms;/* * 懶漢式單例模式 */public class DemoLH {    private static DemoLH instance ;    private DemoLH(){}    public synchronized static DemoLH  getinstance(){        if(instance == null)        {            instance = new DemoLH();        }        return instance;    }}

(3) 雙重檢測鎖式:由於JVM層底內部模型原因,偶爾會出現問題,不建議使用。

 

         ·解決了懶漢式的每次都需要鎖判斷的資源浪費。

   ·將鎖放到if判斷的內部,提高了效率,不需要每次都進行同步。

 

package kw.test.sjms;/* * 雙重鎖的單例模式 */public class DemoSCS {    private DemoSCS(){}    private static DemoSCS instance = null ;        public static DemoSCS getInstance() {        if(instance == null)        {            DemoSCS demoSCS;            synchronized (DemoSCS.class) {                if(instance == null)                {                    instance = new DemoSCS();                }                        }        }        return instance;    }}

 

(4)靜態內部類式:安全執行緒,調用效率高,但是可以消極式載入

         ·安全執行緒、效率高於懶漢式,並且有懶載入。

package kw.test.sjms;/* * 靜態內部類 */public class DemoJTNB {    private static class createInstance {        private static final DemoJTNB instance = new DemoJTNB();    }    private DemoJTNB()    {    }    public  static DemoJTNB getInstance() {        return createInstance.instance;    }}

(5) 枚舉單例:安全執行緒,調用效率高,不能消極式載入,可以防止反射建立。

         ·枚舉是天然的單例。但是沒有消極式載入的功能。

package kw.test.sjms;public enum DemoMJ {    instace;    public void getInstance() {    }}

 

 

 

 

最好的模式:安全執行緒、調用效率高、要有懶載入。最完美的實現方式。

 

java單例模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.