簡單總結(jié)單例模式的4種寫法
一、單例模式
屬于創(chuàng)建者模式的一種, 單例模式的目的是使該類只有一個實例,同一個類的不同對象有不同的hashCode()
單例模式是由該類自行創(chuàng)建唯一個向外暴露的全局的對象
二、寫法
- 餓漢式:無線程安全,但是類以加載就會創(chuàng)建實例,浪費資源
- 懶漢式:存在線程安全,需要加synchroined
- 內(nèi)部類:無線程安全(完美方案)
- 枚舉: 線程安全,聽說是高效java推薦的寫法
三、餓漢式
/** * 餓漢式: * 不適用new創(chuàng)建對象而是使用靜態(tài)的getInstance()方法創(chuàng)建對象 * jvm保證線程安全 */ public class SingleTest{ public static void main(String[] args) { Single single1 = Single.getInstance(); Single single2 = Single.getInstance(); System.out.println(single1.hashCode()); System.out.println(single2.hashCode()); System.out.println(single1 == single2); } } class Single { final static Single INSTANCE = new Single(); public static Single getInstance(){return INSTANCE;} }
四、懶漢式
//懶漢式的線程安全的寫法又稱為雙檢索懶漢模式 public class SingleTest { public static void main(String[] args) { for(int i = 0;i < 10; i++){ new Thread(new Runnable() { @Override public void run() { System.out.println(Single.getInstance().hashCode()); } }).start(); } } } class Single{ private static Single instance = null; Single(){} public static Single getInstance(){ if (instance == null){ synchronized (Single.class) { if(instance == null){ try{ Thread.sleep(1); }catch (Exception e){ e.printStackTrace(); } instance = new Single(); } } } return instance; } }
五、內(nèi)部類
/** * 靜態(tài)內(nèi)部類:完美寫法 */ public class SingleTest { public static void main(String[] args) { Single single1 = Single.getInstance(); Single single2 = Single.getInstance(); System.out.println(single1.hashCode()); System.out.println(single2.hashCode()); System.out.println(single1 == single2); } } class Single{ private static Single instance; public static Single getInstance(){ return InnerSingle.INSTANCE; } private static class InnerSingle{ private final static Single INSTANCE = new Single(); } }
六、枚舉
//枚舉:完美寫法 public class SingleTest { public static void main(String[] args) { Single single1 = Single.INSTANCE; Single single2 = Single.INSTANCE; System.out.println(single1.hashCode()); System.out.println(single2.hashCode()); System.out.println(single1 == single2); } } enum Single{ INSTANCE; }
七、結(jié)論
優(yōu)點:
- 單例模式可以保證內(nèi)存里只有一個實例,減少了內(nèi)存的開銷。
- 避免對資源的多重占用
- 單例模式設置全局訪問點,可以優(yōu)化和共享資源的訪問。
缺點:
- 沒有接口,擴展不了代碼,違背了開閉原則
- 單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則。
到此這篇關于簡單總結(jié)單例模式的4種寫法的文章就介紹到這了,更多相關單例模式的4種寫法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot+STOMP協(xié)議實現(xiàn)私聊、群聊
本文將結(jié)合實例代碼,介紹SpringBoot+STOMP協(xié)議實現(xiàn)私聊、群聊,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-06-06SpringBoot+ruoyi框架文件上傳和下載的實現(xiàn)
文件的上傳和下載功能,是項目開發(fā)過程中比較常見的業(yè)務需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09使用spring mail發(fā)送html郵件的示例代碼
本篇文章主要介紹了使用spring mail發(fā)送html郵件的示例代碼,這里整理了詳細的示例代碼,具有一定的參考價值,有興趣的可以了解一下2017-09-09Java連接 JDBC基礎知識(操作數(shù)據(jù)庫:增刪改查)
這篇文章主要介紹了Java連接 JDBC基礎知識,包括操作數(shù)據(jù)庫之增刪改查操作,需要的朋友可以參考下2021-04-04idea打開項目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題
這篇文章主要介紹了idea打開項目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF
這篇文章主要介紹了Java基于Spire Cloud Excel把Excel轉(zhuǎn)換成PDF,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02