單例模式梳理

使用場景

使用單例模式的目的:
1、併發訪問資源,如windows系統的某個doc文檔
2、控制實例產生的數量,如數據庫線程池
3、高併發環境下,作爲通信的媒介,共享資源內數據
學習自:https://blog.csdn.net/weiwangchao_/article/details/7285211
感興趣的同學可以看一下,解釋的還算透徹

創建方式

單例模式的創建方式,總體歸納來說,只有兩類:

  1. 餓漢模式 ; 對象引用時創建唯一實例,線程安全
  2. 懶漢模式 ;調用方法時創建唯一實例

餓漢模式

傳統創建方式

public class Singleton1 {
private final static Singleton1 SINGLETON_1 = new Singleton1();
public Singleton1(){

}

public static Singleton1 getInstance(){
    return SINGLETON_1;
}

}
缺點:實例直接創建,非懶加載模式,造成某些bean創建可能大量耗時

靜態塊加載

public class Singleton4 {
private final static Singleton4 singleton4;
private Singleton4() { }
static { singleton4 = new Singleton4(); }
public static Singleton4 getInstance() { return singleton4; }
}
改進:實現了懶加載模式
缺點:

靜態內部類加載【推薦】

public class Singleton6 {
private Singleton6() { }
private static class SingletonHolder { private static final Singleton6 INSTANCE = new Singleton6(); }
public static Singleton6 getInstance() { return Singleton6.SingletonHolder.INSTANCE; }
}
改進:實現了懶加載模式
缺點:

枚舉加載【推薦】

public class Singleton7 {
private Singleton7() { }
enum SingletonEnum {
INSTANCE;
private final Singleton7 singleton7;
private SingletonEnum() { singleton7 = new Singleton7(); }
}
public static Singleton7 getInstance() { return SingletonEnum.INSTANCE.singleton7; }
}
改進:實現了懶加載模式,反序列化對象後也不需要重新創建唯一實例
缺點:

懶漢模式

傳統創建方式

public class Singleton2 {
private final static Singleton2 singleton2;
private Singleton2() { }
public static Singleton2 getInstance() {
if (singleton2 == null) singleton2 = new Singleton2();
return singleton2; }
}
缺點:線程不安全,高併發時可能會創建不同的實例

全局鎖模式加載

public class Singleton3 {
private final static Singleton3 singleton3;
private Singleton3() { }
public synchronized static Singleton3 getInstance() {
if (singleton3 == null) singleton3 = new Singleton3();
return singleton3; }
}
改進:線程安全
缺點:獲取實例時,每次都鎖整個對象,高併發時造成不必要耗時

雙重校驗鎖模式加載

public class Singleton5 {
private static volatile Singleton5 singleton5;
private Singleton5() { }
public static Singleton5 getInstance() {
if (singleton5 == null) {
synchronized (Singleton5.class) {
if (singleton5 == null) {
singleton5 = new Singleton5();
}
}
}
return singleton5; }
}
改進:線程安全,只有在實例不存在時,才鎖對象創建
缺點:volatile關鍵字,強制其他線程對實例無寫操作時,纔可獲取。高併發時,對性能可能會有一定的影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章