單例模式(Singleton)
也叫單子模式,是一種常用的軟件設(shè)計模式。在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統(tǒng)只需要擁有一個的全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。比如在某個服務(wù)器程序中,該服務(wù)器的配置信息存放在一個文件中,這些配置數(shù)據(jù)由一個單例對象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在復(fù)雜環(huán)境下的配置管理。
一般通過 {className}.getInstance()來獲得.
1: 餓漢式
特點: 線程安全,調(diào)用效率高,但是不能延時加載
public class Singleton {
private Singleton() {
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
//...other function
}
2: 懶漢式
特點: 線程安全, 調(diào)用效率不高, 可以延長加載.
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
}
//注意, 這里一定要用synchronized保證線程安全
synchronized public static Singleton getInstance(){
if( null == singleton )
singleton = new Singleton();
return singleton;
}
//...other function
}
3: 懶漢式--雙重檢查
特點: 線程安全, 調(diào)用效率高, 可以延長加載.
方法2中的性能不夠好. 可以做如下的改進(jìn), volatile關(guān)鍵字的重要作用是禁止指令重排序, 保證內(nèi)存不會出現(xiàn)內(nèi)存分配, 返回對象引用, 初始化這樣的錯序.
下面的代碼即為餓漢式的雙重檢查.
public class Singleton {
private Singleton(){}
private volatile static Singleton singleton = null;
public static Singleton getInstance(){
if( null == singleton ){
synchronized (Singleton.class){
if( null == singleton ){
singleton = new Singleton();
}
}
}
return singleton;
}
}
4: 枚舉
特點: 線程安全, 調(diào)用效率高, 不能延長加載, 代碼精簡
public enum Singleton {
INSTANCE;
}