Java中設計模式之單例設計模式-1
阿新 • • 發佈:2019-02-05
單例作用
- 1 節省記憶體
- 2 可以避免多種狀態導致狀態衝突
單例的建立步驟
- 1 私有化構造方法
- 2 私有化宣告的屬性
- 3 getInstance
- 4 方法需要靜態
單例分類
1.懶漢式
2.餓漢式
兩種單例區別:
餓漢式 執行緒安全的
懶漢式 執行緒不安全的
餓漢式:
package 設計模式之單例;
//餓漢式:
public class HungeryMode {
private final static HungeryMode INSTANCE=new HungeryMode();
public static HungeryMode getInstance() {
return INSTANCE;
}
private HungeryMode(){}
}
懶漢式:
package 設計模式之單例;
public class LazyMode {
private static LazyMode instance=null;
public static LazyMode getInstance() {
if(instance==null){
instance=new LazyMode();
}
return instance;
}
private LazyMode(){}
}
測試:
package 設計模式之單例;
public class Test1 {
public static void main(String[] args){
//餓漢式
HungeryMode instance=HungeryMode.getInstance();
HungeryMode instance2=HungeryMode.getInstance();
System.out.println("instance=" +instance);
System.out.println("instance2="+instance2);
// 懶漢式
LazyMode instance3=LazyMode.getInstance();
LazyMode instance4=LazyMode.getInstance();
LazyMode instance5=LazyMode.getInstance();
System.out.println("instance3="+instance3+","+instance3.hashCode());
System.out.println("instance4="+instance4+","+instance4.hashCode());
System.out.println("instance5="+instance5+","+instance5.hashCode());
}
}
測試結果:
建立多個物件,測試記憶體地址,如果相同說明建立的是同一個物件,說明建立的是單例!
延伸—————————–懶漢式執行緒安全性處理————————–
懶漢式執行緒不安全原因:
在多執行緒中,建立單例時,可能出現多個執行緒進入if(instance==null)執行語句中,在一個執行緒建立了一個instance後,其他進入執行語句的執行緒也會接著建立,這樣就會產生多個物件,實現不了單例了,此時不安全了。
程式碼:
package 設計模式之單例;
public class LazyMode2 {
private static LazyMode2 instance=null;
private LazyMode2(){}
public static LazyMode2 getInstance(){
// 雙重檢查
if(instance==null){// 為了提高效率 儘可能少的讓執行緒反覆判斷鎖
synchronized (LazyMode2.class) {// 靜態方法中 不能使用this 就可以用 本類.class 來代替
if(instance==null){
instance=new LazyMode2();
}
}
}
return instance;
}
}