北京尚學堂 單例模式筆記

2021-08-22 05:52:07 字數 2965 閱讀 5399

public static synchronized dbconnectionmanager getinstance()  

return instance;  

}  說這個採用了單例模式,多個資料庫連線時返回唯一例項,如果是第一次呼叫此方法,則建立例項 。其實當時真的是一臉懵逼,不知道為啥,只知道講師這樣做了,我也跟著這樣做,然後就這樣一步步做了下來,那個是我第一次接觸連線資料庫的小專案,叫***租賃管理系統,在網易雲上的課程,大家如果有初學者感興趣可以去看看。接著說今天的主題:單例模式。

單例模式是用以確保乙個特定的類只有乙個物件被例項化的一種設計模式理念。它一般運用在資料庫操作裡,資料庫在進行操作時要經常建立例項,然後再進行資料庫操作,所以就將資料庫操作的方法進行封裝,採用單例模式進行設計。

為什麼要採用這樣的設計呢?好處是毋庸置疑的,它一是像概念說的那樣,只生成乙個例項,當乙個物件的產生需要比較多的資源時,可以通過在應用啟動時直接產生乙個單例物件,然後永久駐留記憶體的方式來解決;二是可以在系統設定全域性的訪問點,優化共享資源訪問。

餓漢式(呼叫效率高。但是不可以延時載入)【可以使用】

優點:餓漢式單例模式**塊中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問該物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。因此,執行緒是安全的。

缺點:

如果只是載入本類,而不是要呼叫getinstance(),甚至永遠沒有呼叫,則會造成資源的浪費。

案例演示:

public class singletondemo01 

//方法沒有同步,呼叫效率高!

public static singletondemo01 getinstance()

}

懶漢式(呼叫效率不高。但是可以延時載入)【單執行緒可以使用,多執行緒加鎖使用】

優點:lazy load!延時載入,懶載入!真正用的時候才載入。

缺點:

資源利用效率高了。但是每次呼叫getinstance()方法都要同步,併發效率低。

如果在不加鎖的情況下不允許在多執行緒下使用,是不安全的。因為在多執行緒下,當乙個執行緒進入了if(s==null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。因此多執行緒情況下不允許不加鎖使用。

案例演示:

public class singletondemo02 

//方法同步,呼叫效率低

public static synchronized singletondemo02 getinstance()

return instance;

}}

雙重檢測鎖(由於jvm底層內部模型原因,偶爾會出現問題)【不建議使用】

優點:這種模式將同步內容放到if內部,提高了執行的效率,不必每次獲取物件時都進行同步,只有第一次才同步建立,以後就沒必要了。

缺點:

由於編譯器優化原因和jvm底層內部模型原因,偶爾會出現問題,不建議使用。

public class singletondemo03 

public static synchronized singletondemo03 getinstance()

}instance = sc;}}

} return instance;

}}

靜態內部類實現(呼叫效率高,而且可以延時載入)【推薦使用】

要點:外部類沒有static屬性,則不會像餓漢式那樣立即載入物件。

只有真正呼叫getinstance(),才會載入靜態內部類。載入類時是執行緒安全的。instance是static final型別,保證了記憶體中只有這樣乙個例項存在,而且只能被賦值一次,從而保證了執行緒安全性。

兼備了併發高效呼叫和延遲載入的優勢。

public class singletondemo04 

public static singletondemo04 getinstance()

private singletondemo04()

}

列舉實現單例模式(呼叫效率高,不能延時載入,但是可以天然的防止反射和反序列化漏洞)【推薦使用】

優點:實現簡單

列舉本身就是單例模式。由於jvm從根本上提供了保障!避免了通過反射和反序列化的漏洞!(如何通過反射和反序列化得到單例物件,請看下一條部落格)。

缺點:

無延時載入。

public enum singletondemo05 

}

測試**:

public class clienttest02 

countdownlatch.countdown();

}}).start();

} countdownlatch.await();//main執行緒阻塞,直到計數器變為0,才會繼續往下執行。

long end = system.currenttimemillis();

system.out.println(end-start);

}}

測試結果:(效率請參照相對值)

多執行緒環境下的效率測試

餓漢式10懶漢式

145雙重檢查鎖

126靜態內部類

13列舉類

20---單例物件 占用資源少,不需要延時載入 :列舉式好於餓漢式

---單例物件 占用資源大,需要延時載入   :靜態內部類好於懶漢式

---雙重檢查鎖不推薦使用,多執行緒使用懶漢式注意加鎖!

python之父北京尚學堂 北京尚學堂 主頁

你輸入的郵件位址曾經通過 啟用了本站帳號,請使用 帳號直接登入。課程習題 提示請選擇乙個答案 提交檢視正確答案 下一題 0 data index data name 課程進度 開課時間待定 開課 進行到第 周 已結束 分 分 檢視證書 開啟奮鬥模式 已開啟奮鬥模式 申請證書 已申請證書,成績合格即頒...

尚學堂 oracle筆記

sql plus是oracle的乙個客戶端 cmd sqlplus 開啟瀏覽器http localhost 5560 isqlplus cmd cd c oracle product 10.2.0 db 1 bin sqlplus alter user scott account c oracle ...

橋接模式(bridge) 尚學堂筆記

未使用橋接模式 使用橋接模式 package com.bjsxt.bridge 品牌 author administrator public inte ce brand class lenovo implements brand class dell implements brand class s...