1. 程式人生 > >Java中設計模式之單例設計模式-1

Java中設計模式之單例設計模式-1

單例作用

  • 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;
    }
}