1.餓漢式:類初始化時,會立即載入該物件,執行緒天生安全,呼叫效率高。(spring裡面的是餓漢式)
2.懶漢式: 類初始化時,不會初始化該物件,真正需要使用的時候才會建立該物件,具備懶載入功能。
3.靜態內部方式:結合了懶漢式和餓漢式各自的優點,真正需要物件的時候才會載入,載入類是執行緒安全的。
4.列舉單例: 使用列舉實現單例模式 優點:實現簡單、呼叫效率高,列舉本身就是單例,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞, 缺點沒有延遲載入。
5.雙重檢測鎖方式(因為jvm本質重排序的原因,可能會初始化多次,不推薦使用)
天生執行緒安全(因為它一初始化就建立物件,其他執行緒只是讀而不是寫????如果寫的話會怎樣呢?也執行緒安全嗎?應該要在宣告物件的前面加上final修飾符吧)
//餓漢式
public class singletondemo01
public static singletondemo01 getinstance()
public static void main(string args)
}
輸出結果為true
//懶漢式
public class singletondemo02
//類初始化時,不會初始化該物件,真正需要使用的時候才會建立該物件。
private static singletondemo02 singletondemo02;
private singletondemo02()
//加上synchronized之後,每次只能有乙個執行緒進行訪問,效率就降低了
public synchronized static singletondemo02 getinstance()
return singletondemo02;
} public static void main(string args)
}
什麼是列舉(列舉這塊知識還是不清晰)
列舉本身是單例的,一般用於專案中定義常量。
enum userenum
public integer getcode()
public void setcode(integer code)
public string getname()
public void setname(string name)
}public class testenum
}/使用列舉實現單例模式 優點:實現簡單、列舉本身就是單例,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞 缺點沒有延遲載入
public class user
private static enum singletondemo04
public user getinstance()
} public static void main(string args)
}
public class singletondemo04
執行雙重檢查是因為,如果多個執行緒同時了通過了第一次檢查,並且其中乙個執行緒首先通過了第二次檢查並例項化了物件,那麼剩餘通過了第一次檢查的執行緒就不會再去例項化物件。
這樣,除了初始化的時候會出現加鎖的情況,後續的所有呼叫都會避免加鎖而直接返回,解決了效能消耗的問題。
public singletondemo04 getinstance() }}
return singletondemo04;
}}
單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...