定義
確保每個類只存在一個實例趴拧,而且自行實例化并向整個系統(tǒng)提供這個實例
使用場景
訪問IO,數(shù)據(jù)庫锣杂,網(wǎng)絡等需要消耗多資源的對象
實現(xiàn)方式
餓漢模式
這家伙太饑餓難耐啦此洲,什么也不干,也不想想在多線程時候怎么保證單例對象的唯一性业崖。
public class HungrySingleton {
private static final HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
/**防止反序列化重新構建對象*/
private Object readResolve() throws ObjectStreamException{
return hungrySingleton;
}
}
懶漢模式
這家伙懂事點點涯呻,考慮到多線程時候怎么保證單例對象的唯一性凉驻。就加個synchronized關鍵字嘛,每次調用該方法都進行同步复罐,但是反應還是有點遲鈍涝登。
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton(){}
/**偷懶! 只判斷一次效诅,造成每次調用該方法都進行同步*/
public static synchronized LazySingleton getInstance(){
if (lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
/**防止反序列化重新構建對象*/
private Object readResolve() throws ObjectStreamException {
return lazySingleton;
}
}
雙重檢查鎖定
還是這家伙還是挺老實的胀滚,干活不怕苦不怕累,使用了兩次判空操作乱投,第一次判空防止不必要的同步咽笼,第二次判空保證在null情況下才創(chuàng)建實例。
public class DCLSingleton {
private static volatile DCLSingleton dclSingleton = null;
private DCLSingleton(){}
public static DCLSingleton getInstance(){
if (dclSingleton == null){ //避免不必要的同步
synchronized (DCLSingleton.class){
if (dclSingleton == null){
dclSingleton = new DCLSingleton();
}
}
}
return dclSingleton;
}
/**防止反序列化重新構建對象*/
private Object readResolve() throws ObjectStreamException {
return dclSingleton;
}
}
靜態(tài)內部類
這家伙比較靠譜了戚炫,既保證線程安全剑刑,也保證單例唯一性,又延遲了單例的實例化双肤,mua
public class StaticInnerSingleton {
private StaticInnerSingleton(){}
public static StaticInnerSingleton getInstance(){
return StaticInnerSingleHolder.staticInnerSingleton;
}
private static class StaticInnerSingleHolder{
private static final StaticInnerSingleton staticInnerSingleton = new StaticInnerSingleton();
}
/**防止反序列化重新構建對象*/
private Object readResolve() throws ObjectStreamException {
return StaticInnerSingleHolder.staticInnerSingleton;
}
}
注意事項
以上實現(xiàn)方式施掏,在反序列化時候會重新創(chuàng)建對象,所以必須加入以下方法
/**防止反序列化重新構建對象*/
private Object readResolve() throws ObjectStreamException {
return StaticInnerSingleHolder.staticInnerSingleton;
}
總結
待更新...