餓漢式
在靜態(tài)代碼塊中直接加載進jvm枣察;
缺點:一開始就會被加載進來。
懶漢式
在初始化時判斷是否已經(jīng)被初始化
缺陷:若多線程初始化則會被重復初始化
雙重判斷加同步鎖
在INSTANCE上加voliate 防止代碼重排序
避免在未初始化時就被引用
在同步代碼塊時加synchronized晰奖,保證一個線程可以獲得鎖并進行初始化;
靜態(tài)內部類單例
避免使用了同步鎖腥泥,通過jvm內部的機制保證了線程安全(類加載只能一次)
枚舉單例
最完美的單例
可以防止反序列化
為什么可以防止反序列化匾南?因為反序列化依賴于類的構造函數(shù),而枚舉單例不存在構造函數(shù)