標籤:利用 demo turn 單例模式 判斷 nbsp 一句話 資料庫連接 使用情境
之前只知道單例模式有兩種:懶漢式和餓漢式,後來因為看到一句話,如果你將建構函式私人化,別人使用反射,這個時候怎麼辦,所以就知道了第三種方式枚舉模式。然後今天又看到了靜態內部類式和雙重檢測鎖,今天就總結一下。
一、單例模式
(1)核心:保證只有一個執行個體,並提供一個訪問全域的訪問點。
(2)使用情境:
Windows的工作管理員
.Windows的資源回收筒
項目中讀取設定檔,沒有必要每次都進行讀取。
網站計數器
日誌管理
資料庫連接池,等等
(3)優點
使用單例只產生一個對象,減少系統的開銷,對於一個對象產生需要比較多的資源,如配置、產生依賴對象時,我們可以使用單例對象
單例模式可以設定全域的訪問點,共用資源的訪問。
2.單例設計模式的實現方式
(1)餓漢式:安全執行緒,調用效率高,但是不消極式載入
a) 首先私人建構函式
b) 使用私人得靜態變數建立一個方法
c) 提供一個靜態方法訪問次對象
它是一個安全執行緒的的模式,對象不是自己來建立,而是有一個對象等待使用,不需要同步,效率高。
浪費資源,沒有消極式載入。
實現方式:
package kw.test.sjms;/* * 單例模式 * 餓漢式單例模式 * */public class DemoEH { private static DemoEH instance = new DemoEH(); private DemoEH() {} public static DemoEH getInstace() { return instance; }}
(2)懶漢式:安全執行緒,調用效率不高,但是,可以消極式載入
··· 使用的時候才去載入,但是需要使用synchronized
· ··· 資源使用率高,但是效率不是很高。
···缺點:每次都需要同步,浪費資源。
實現方式:
package kw.test.sjms;/* * 懶漢式單例模式 */public class DemoLH { private static DemoLH instance ; private DemoLH(){} public synchronized static DemoLH getinstance(){ if(instance == null) { instance = new DemoLH(); } return instance; }}
(3) 雙重檢測鎖式:由於JVM層底內部模型原因,偶爾會出現問題,不建議使用。
·解決了懶漢式的每次都需要鎖判斷的資源浪費。
·將鎖放到if判斷的內部,提高了效率,不需要每次都進行同步。
package kw.test.sjms;/* * 雙重鎖的單例模式 */public class DemoSCS { private DemoSCS(){} private static DemoSCS instance = null ; public static DemoSCS getInstance() { if(instance == null) { DemoSCS demoSCS; synchronized (DemoSCS.class) { if(instance == null) { instance = new DemoSCS(); } } } return instance; }}
(4)靜態內部類式:安全執行緒,調用效率高,但是可以消極式載入
·安全執行緒、效率高於懶漢式,並且有懶載入。
package kw.test.sjms;/* * 靜態內部類 */public class DemoJTNB { private static class createInstance { private static final DemoJTNB instance = new DemoJTNB(); } private DemoJTNB() { } public static DemoJTNB getInstance() { return createInstance.instance; }}
(5) 枚舉單例:安全執行緒,調用效率高,不能消極式載入,可以防止反射建立。
·枚舉是天然的單例。但是沒有消極式載入的功能。
package kw.test.sjms;public enum DemoMJ { instace; public void getInstance() { }}
最好的模式:安全執行緒、調用效率高、要有懶載入。最完美的實現方式。
java單例模式