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錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...