前言
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),涇縣企業(yè)網(wǎng)站建設(shè),涇縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,涇縣網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,涇縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
近期在做支付,一開始圖省事,也是為了調(diào)試方便,支付的alipayClient和tradeService都是使用的時候去拿,這樣就會導(dǎo)致創(chuàng)建多次。為了節(jié)省資源,統(tǒng)一配置成單例模式。
什么是單例
Singleton(單例)是設(shè)計模式的一種,為了保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
單例特點
單例應(yīng)用
資源管理器,回收站,打印機(jī)資源,線程池,緩存,配置信息類,管理類,控制類,門面類,代理類通常被設(shè)計為單例類。如果程序有多個類加載器又同時使用單例模式就要保證單例的唯一性了。
實現(xiàn)方式
餓漢式
/** * 餓漢式 * */ public class Singleton { private static Singleton instance = new Singleton(); //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 private Singleton() {} //提供全局訪問點獲取唯一的實例 public static Singleton getInstance() { return instance; } }
如果開銷比較大,希望用到時才創(chuàng)建就要考慮延遲實例化,就要用后面的方法了。
懶漢式
/** * 懶漢式 */ public class Singleton { private static Singleton instance; //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 private Singleton() {} public static synchronized Singleton getInstance() { if(instance==null){ instance = new Singleton(); } return instance; } }
懶漢式(雙重鎖)
“雙檢鎖”(Double-Checked Lock)盡量將”加鎖”推遲,只在需要時”加鎖”(僅適用于java 5.0 以上版本,volatile保證原子操作)。
happens-before:”什么什么一定在什么什么之前運行”,也就是保證順序性。
現(xiàn)在的CPU有亂序執(zhí)行的能力(也就是指令會亂序或并行運行,可以不按我們寫代碼的順序執(zhí)行內(nèi)存的存取過程),并且多個CPU之間的緩存也不保證實時同步,只有上面的happens-before所規(guī)定的情況下才保證順序性。
JVM能夠根據(jù)CPU的特性(CPU的多級緩存系統(tǒng)、多核處理器等)適當(dāng)?shù)闹匦屡判驒C(jī)器指令,使機(jī)器指令更符合CPU的執(zhí)行特點,最大限度的發(fā)揮機(jī)器的性能.
如果沒有volatile修飾符則可能出現(xiàn)一個線程t1的B操作和另一線程t2的C操作之間對instance的讀寫沒有happens-before,可能會造成的現(xiàn)象是t1的B操作還沒有完全構(gòu)造成功,但t2的C已經(jīng)看到instance為非空,這樣t2就直接返回了未完全構(gòu)造的instance的引用,t2想對instance進(jìn)行操作就會出問題。
volatile 的功能:
優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份
/** * 懶漢式(雙重鎖) */ public class Singleton { //使用 volatile 保證可見性 private volatile static Singleton instance; //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 private Singleton() {} public static Singleton getInstance() { if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance = new Singleton(); } } } return instance; } }
內(nèi)部類
/** * 內(nèi)部類 */ public class Singleton { //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 private Singleton() {} /** * 類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實例與外部類的實例 * 沒有綁定關(guān)系,而且只有被調(diào)用到才會裝載,從而實現(xiàn)了延遲加載 */ private static class SingletonHolder{ /** * 靜態(tài)初始化器,由JVM來保證線程安全 */ private static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。