定義:保證程式運行時,讓某個類在記憶體中只有一個物件,即讓一個類只能創建一個物件
好處:有些實體,全域只需要一個就可以了,使用單例模式就可以防止一個全域使用的類,頻繁的創建與銷毀,導致耗費系統資源,
設計要素
1.一個私有靜態變數 (確保只有一個實體)
2.一個私有建構式 (確保只能單例類自己創建實體)
3.一個公有靜態函式 (給使用者提供呼叫方法)
第一種:餓漢模式(執行緒安全)
public class Singleton1 {
//創建當前類的物件
private static Singleton1 s = new Singleton1();
//構造方法私有化
private Singleton1(){
}
//對外提供公共的訪問方法將Singleton1物件暴露給外部
public static Singleton1 getInstance(){
return s;
}
}
優點:提前實體化好了一個實體,避免了執行緒不安全問題的出現,
缺點:系統沒有使用這個實體,或很久之后才需要這個實體,就會資源浪費,
第二種:懶漢模式
(如果方法沒有synchronized,則執行緒不安全)
public class Singleton2 {
//創建當前類物件
private static Singleton2 s= null;
//構造方法私有化
private Singleton2(){
}
//對外提供公共的訪問方法將Singleton2物件暴露給外部
public static synchronized Singleton2 getInstance(){
if(s == null){
s = new Singleton3();
}
return s;
}
}
優點:延遲實體化,節約了資源,并且是執行緒安全的,
缺點:雖然解決了執行緒安全問題,但是性能降低了,因為,即使實體已經實體化了,既后續不會再出現執行緒安全問題了,但是鎖還在,每次還是只能拿到鎖的執行緒進入,使執行緒阻塞,等待時間過長,
第三種:雙重檢查鎖 (執行緒安全)
(懶漢模式改良版)
(目的是為了減少同步的開銷)
public class Singleton3 {
private volatile static Singleton3 s = null;
private Singleton3(){
}
public static Singleton3 getInstance(){
if(s == null){
synchronized (Singleton3.class) {
if(s == null){
s = new Singleton3();
}
}
}
return s;
}
}
優點:延遲實體化,節約了資源;執行緒安全;并且相對于 執行緒安全的懶漢式,性能提高了,
缺點:volatile 關鍵字,對性能有一些影響,
第四種:靜態內部類實作(執行緒安全)
public class Singleton4 {
private Singleton4(){
}
public static Singleton4 getInstance(){
return SingletonFactory.s;
}
private static class SingletonFactory{
private static Singleton4 s = new Singleton4();
}
}
優點:延遲實體化,節約了資源;且執行緒安全;性能也提高了,
第五種 列舉類實作(執行緒安全)
public enum Singleton5 {
//代表了Singleton5的一個實體
INSTANCE;
//添加自己需要的操作
public void doSomeThing() {
}
}
優點:寫法簡單,執行緒安全,天然防止反射和反序列化呼叫,
破壞單例模式的三種方式
反射
序列化
克隆
解決方案如下:
1、防止反射
定義一個全域變數,當第二次創建的時候拋出例外
2、防止序列化破壞
在被序列化的類中添加readResolve方法
3、防止克隆破壞
重寫clone方法,回傳原來的實體
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198664.html
標籤:其他
下一篇:C語言實作RSA的簡單加解密
