單例模式
單例模式的目的是:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
- 優點:
- 在內存裏只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷燬實例。
- 避免對資源的多重佔用。
- 缺點:
- 沒有接口,不能繼承,與單一職責原則衝突。
懶漢式
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static [synchronized] Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
本方式中,用synchronized修飾時是線程安全的
餓漢式 [線程安全]
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
雙檢鎖 [線程安全]
public class Singleton {
private volatile static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) { //第一次檢查
synchronized (Singleton.class) {
if (instance == null) { //第二次檢查
instance = new Singleton();
}
}
}
return instance;
}
}
雙重檢查加鎖機制:並不是每次進入getInstance方法都需要同步,而是先檢查實例是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。進入同步塊過後,再次檢查實例是否存在,如果不存在,就在同步的情況下創建一個實例,這是第二重檢查。這樣一來減少了多次在同步情況下進行判斷所浪費的時間。
靜態內部類 [線程安全]
public class Singleton {
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
枚舉類 [線程安全]
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}