單例設計模式保證類在記憶體中只存在乙個物件。根據不同的策略,單例類的實現有以下幾種方式。
1. 立即載入
在載入類的同時例項化物件,設計要點如下:
(1)私有化構造方法;
(2)宣告並例項化本類物件(靜態);
(3)提供公有靜態方法獲取物件。
code 1
public class eagersingleton
// other private constructors
private static eagersingleton instance = new eagersingleton();
public static eagersingleton getinstance()
// other methods
}
當成員不可變時,也可直接暴露給外部使用,簡化如下:
code 2
public class eagersingleton
// other private constructors
public static final eagersingleton instance = new eagersingleton();
// other methods
}
2. 延遲載入(懶載入)
物件第一次使用時例項化,設計要點如下:
(1)私有化構造方法;
(2)宣告本類的靜態引用;
(3)提供公有靜態方法獲取物件,第一次獲取時例項化。
code 3
public class lazysingleton
// other private constructors
private static lazysingleton instance = null;
public static lazysingleton getinstance()
// other methods
}
上述實現方式具有執行緒安全問題,當多個執行緒同時呼叫getinstance方法時,可能會建立多個例項。以下採用同步的方式解決執行緒安全問題:
code 4
public class lazysingleton
// other private constructors
private static volatile lazysingleton instance = null;
public static lazysingleton getinstance()
return instance;
}// other methods
}
code 4 中的volatile關鍵字有兩個作用:
(1)保證執行緒可見性:乙個執行緒對volatile變數的修改會立即由工作記憶體(執行緒獨享)寫回主記憶體(執行緒共享),volatile使變數的修改可以及時反映到其他執行緒中;
(2)禁止指令重排序:由於編譯器的優化,**的實際執行順序與編寫順序可能不一致。volatile關鍵字可禁止這種優化(jdk 1.5之後)。
code 4 可以解決執行緒安全問題,但執行效率很低。因為例項化僅在第一次呼叫時執行,而每次獲取例項時均要同步,執行緒排隊導致效率降低。以下採用雙重檢查的方式避免執行緒排隊:
code 5
public class lazysingleton
// other private constructors
private static volatile lazysingleton instance;
public static lazysingleton getinstance()
}return instance;
}// other methods
}
上述實現略顯繁瑣,但可兼顧效率與安全(要求jdk版本至少為1.5)。
3. 列舉方式
列舉實現單例類最為簡單,可以保證執行緒安全,同時可以防止通過反射呼叫私有方法。
code 6
public enum enumsingleton
由於列舉類占用記憶體較多,移動開發不建議使用。
4. 靜態內部類方式
因為靜態內部類只會載入一次,並且僅在第一次訪問時才載入,所以能夠實現延遲載入,同時保證執行緒安全。
code 7
public class staticinnerclasssingleton
// other private constructors
public static staticinnerclasssingleton getinstance()
// other methods
private static class staticinnerclass
}
總結:單例類最常見的實現方式是立即載入和延遲載入,採用延遲載入時要注意執行緒安全問題。列舉可以簡化實現,但占用資源相對較多。
單例模式的實現
單例模式估計是咱們碰到最多也是最簡單的一種設計模式了 也是面試中經常會遇到的面試題 單例模式保證乙個類只有乙個例項,比如咱們在android應用中登入成功之後儲存使用者資訊就會優先考慮單例模式。單例模式有六種常規的寫法 餓漢式 懶漢式 執行緒不安全 懶漢式 執行緒安全 dcl雙重校驗模式 靜態內部類...
單例模式的實現
單例模式的實現需要考慮的因素有很多。對於常常出現的double checked實現單例模式實際上是不安全的實現 private static singleton instance public static singleton getinstance 因為jit可以在singleton的構造方法被執...
單例模式的實現
單例 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式是一種常用的軟體設計模式之一,其目的是保證整個應用中只存在類的唯一個例項。比如我們在系統啟動時,需要載入一些公共的配置資訊,對整個應用程式的整個生命週期中都可見且唯一,這時需要設計成單例模式。如 spring容器,session工...