單例模式的幾種寫法

2021-10-02 00:12:52 字數 1310 閱讀 5896

1.餓漢式

public class singleton 

//宣告成員變數

private static singleton singleton = new singleton();

//對外提供介面獲取該例項

public static singleton getinstance()

}

2.懶漢式

public class singleton  //私有構造方法

private static singleton s=null;//宣告成員變數

//對外提供介面獲取該例項

public static singleton getinstance()

return s;

}}

以上兩種都是單例的經典寫法,但是執行緒不安全,為保證執行緒安全,可以 getinstance()加鎖

public class singleton  //私有構造方法

private static singleton s=null;//宣告成員變數

//對外提供介面獲取該例項

public static synchronized singleton getinstance()

return s;

}}

但是在方法上加鎖,每次獲取單例都會判斷,會消耗資源,所以不推薦

3,雙重檢驗鎖 double check lock(dcl)

public class singleton ;

public static singleton getinstance() }}

return instance; //6}}

但是後來在併發情況下,第5行會出現問題,對於第5行,可以分為3個步驟

1 memory=allocate();// 分配記憶體 相當於c的malloc

2 instance(memory) //初始化物件

3 s=memory //設定s指向剛分配的位址

上面的**在編譯器執行時,可能會出現重排序 從1-2-3 排序為1-3-2

在多執行緒下,如果有2個執行緒,執行緒1執行到第5行,執行緒2進來,此時執行緒1執行了1和3,沒有執行2,執行緒2判斷s不為null直接返回乙個未初始化物件,就會出現問題,而此時我們可以新增關鍵字,volatile,禁止指令重排,就不會出現步驟5的**問題

public class singleton ;

public static singleton getinstance() }}

return instance;}}

單例模式幾種寫法

1.餓漢式 public class singleton public static singleton getinstance 2.懶漢式 public class singleton 雙層檢測鎖 public static singleton getinstance return instanc...

單例模式的幾種寫法

所謂單例模式就是確保某乙個類只有乙個例項,並且提供乙個全域性訪問點。例如 執行緒池 快取 對話方塊等等 1 餓漢模式 保證執行緒安全 public class singleton public static singleton getinstance 2 懶漢模式 不保證執行緒安全 public c...

單例模式的幾種寫法

1.懶漢式 public class singleinstance1 private static singleinstance1 instance public static singleinstance1 getinstance return instance 該程式缺點是執行緒不安全 publ...