餓漢式
立即載入,執行緒安全。
public
class
singleton
;public
static singleton getinstance()
}
懶漢式
延遲載入,執行緒不安全。
public
class
singleton
;public
static singleton getinstance()
return instance;
}}
雙檢鎖(dcl)
延遲載入,執行緒安全。
public
class
singleton
;public
static singleton getinstance()
}}return instance;
}}
靜態內部類
延遲載入,執行緒安全。
靜態內部類屬於被動引用,只有在呼叫時才載入。而jvm的類載入機制會保證只有乙個執行緒成功執行方法,初始化類變數。
public
class
singleton
private
static
class
singletonholder
public
static singleton getinstance()
}
列舉
延遲載入,執行緒安全。
public
class
singleton
//靜態列舉類
static
enum singletonholder
public singleton getinstance()
}//對外暴露的獲取方法
public
static singleton getinstance()
}
單例與反射
反射破壞單例:
public
class
singleton
private
static
class
singletonholder
public
static singleton getinstance()
public
static
void
main
(string[
] args)
throws exception
}
一般而言有兩種解決方案:
一:在私有構造中設定標誌位,進行訪問次數的判斷,限制只能訪問一次建構函式。
public
class
singleton
else
}private
static
class
singletonholder
public
static singleton getinstance()
public
static
void
main
(string[
] args)
throws exception
}
二:直接使用列舉式單例,列舉沒有無參構造,天然單例防反射。
單例與序列化
序列化單例物件,再反序列化也可以破壞單例模式:
解決方案:新增readresolve()方法
,在方法中返回單例
原理:在objectinputstream
類的readordinaryobject()
方法中,對readresolve()
方法的存在做了判斷,如果存在,則呼叫該方法獲取返回值作為最終返回。
建立者模式 單例模式 反射 序列化
實現方式 構造器私有,提供乙個外部可以訪問的方法 可以提供例項 1 餓漢式 執行緒安全,呼叫效率高,不能延時載入 2 懶漢式 執行緒安全,呼叫效率不高,可以延時載入 要用的時候才載入 3 雙重鎖檢測式 由於jvm底層內部模型原因,偶爾會出現問題,不建議使用 4 靜態內部類式 執行緒安全,呼叫效率高,...
序列化與單例
當單例模式的類實現了系列化serializable介面,也可以通過反序列化來使它不再單例。我們的單例類 12 3 4 5 6 7 8 9 10 11 12 publicfinalclasssingletonimplementsserializable publicstaticsingleton ge...
單例設計模式 序列化破壞單例模式?
1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...