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...