您好,登錄后才能下訂單哦!
小編給大家分享一下java中單例模式的寫法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
屬于創(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; } }
/** * 靜態(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; }
優(yōu)點:
單例模式可以保證內(nèi)存里只有一個實例,減少了內(nèi)存的開銷。
避免對資源的多重占用
單例模式設(shè)置全局訪問點,可以優(yōu)化和共享資源的訪問。
缺點:
沒有接口,擴(kuò)展不了代碼,違背了開閉原則
單例模式的功能代碼通常寫在一個類中,如果功能設(shè)計不合理,則很容易違背單一職責(zé)原則。
以上是“java中單例模式的寫法有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。