您好,登錄后才能下訂單哦!
小編給大家分享一下java中單例模式的寫法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
屬于創建者模式的一種, 單例模式的目的是使該類只有一個實例,同一個類的不同對象有不同的hashCode()
單例模式是由該類自行創建唯一個向外暴露的全局的對象
餓漢式:無線程安全,但是類以加載就會創建實例,浪費資源
懶漢式:存在線程安全,需要加synchroined
內部類:無線程安全(完美方案)
枚舉: 線程安全,聽說是高效java推薦的寫法
/** * 餓漢式: * 不適用new創建對象而是使用靜態的getInstance()方法創建對象 * 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; } }
/** * 靜態內部類:完美寫法 */ 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; }
優點:
單例模式可以保證內存里只有一個實例,減少了內存的開銷。
避免對資源的多重占用
單例模式設置全局訪問點,可以優化和共享資源的訪問。
缺點:
沒有接口,擴展不了代碼,違背了開閉原則
單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則。
以上是“java中單例模式的寫法有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。