總結單例模式的幾種實現方式及優缺點

2021-09-27 05:55:40 字數 1604 閱讀 1041

1、餓漢式:類初始化的時候,會立即載入該物件,執行緒天生安全,呼叫效率高。

2、懶漢式:類初始化時,不會初始化該物件,真正需要使用的時候才會去建立該物件,具備懶載入功能。

3、雙重檢測方式(因為jvm本身重排序的原因,可能會出現多次的初始化)

4、列舉單例:使用列舉實現單例模式,實現簡單、呼叫效率高,列舉本身就是單例,由jvm從根本上提供保障,避免通過反射和反序列化的漏洞,缺點是沒有延遲載入。

5、靜態內部類方式:結合了懶漢式和餓漢式各自的優點,真正需要物件的時候才會載入,載入類是執行緒安全的。

————————————————————————————————

示例:

1.餓漢式

public class singleton01 

public static singleton01 getinstance()

}

優點:實現簡單,呼叫效率高(提前完成初始化),執行緒安全

缺點: 在不需要的時候可能就載入了,造成記憶體浪費

2.懶漢式

public class singleton02 

public static singleton02 getinstance()

return instance;

}}

優點:只在使用時載入,節省資源

3.雙重檢測

public class singleton03 

public static singleton03 getinstance() }}

return instance;

}}

優點: 只在使用時載入,節省資源

具體原因如下:**④一行,正常的執行順序為:

1.分配記憶體空間  2.初始化物件 3.instance指向物件

但是由於jvm存在重排序,可能順序變成1->3->2

這個時候如果有執行緒呼叫getinstance方法,走**①一行,直接就會返回instance,但是這個時候可能instance的建構函式

還沒有初始化完畢,發生錯誤。

一種解決方案是在instance的變數使用volitile關鍵字宣告,來解決重排序的問題。

4.列舉方式

public enum  singleton04 

public static void main(string args)

}

優點:實現簡單,執行緒安全,防止反射攻擊等。

缺點: 在不需要的時候可能就載入了,造成記憶體浪費

5.靜態內部類

public class singleton05 

private static class singletonholder

public static singleton05 getinstance()

}

優點:在需要的時候載入,執行緒安全

靜態內部類的具體原理參考:

單例模式實現的幾種方式

單例模式三個主要特點 1 構造方法私有化 2 例項化的變數引用私有化 3 獲取例項的方法共有。package com.ctl.singleton 懶漢式單例 該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例 注意 如果編寫的是多執行緒程式,則不要刪...

單例模式的幾種實現方式

單例模式莫過於是我們最常用的設計模式之一了,它的優缺點就是 優也單例,缺也單例 當然應用它方面優點還是較多些的,所以下面我們看看,常用的幾種實現方式有哪些吧。這種是最基本的實現方式,最大的問題就是不支援多執行緒,由於沒有加鎖,嚴格上並不算單例模式。public class singleton pub...

單例模式的幾種實現方式

public class person private person person new person 出現stackoverflowerror錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...