單例作用
- 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;}
}