單例(Singleton)設計模式保證每個類隻有一個實例,並為這個實例提供一個全局的訪問點。
與工具類中靜態成員不同,單例類一般用來保存應用程序的狀態數據,這些數據在應用程序的各個部分都可能被訪問或修改。
單例模式的幾種實現方式。
[java]
public class Singleton{
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
/** Don't let anyone else instantiate this class */
private Singleton() {
}
}
這種方式實現簡單,並且保證實例的唯一性,缺點是必須先加載後使用,而且不管單例類是否真正使用到,實例總是會先被加載,這看起來相當的不妥,因而有瞭懶加載(Lazy Initialization)的模式。
[java]
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
這種方式可以實現懶加載,但當多個線程同時進入getInstance方法時,可能會產生多份實例,這顯然違背單例模式的初衷。為瞭避免這種情況,考慮加上同步(synchronized)機制。
[java]
public class Singleton {
private static Singleton instance = null;
private Singleton(){
}
synchronized static public Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
這種方式可以在懶加載的同時保證隻有一份實例,但對整個getInstance方法作同步處理會帶來線程同步上的性能消耗。www.aiwalls.com
[java]
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance() {
if (instance == null){
synchronized(Singleton.class){
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
上面的方式就是所謂的Double-check Locking即雙重檢查和鎖定模式,目前看來很完美。
作者:fancy888