天天看點

單例模式 餓漢&懶漢&a雙重校驗鎖

懶漢:在初始化類的時候,不建立唯一的執行個體,而是等到真正需要用到的時候才建立。必須加上同步,否則有可能依然建立多個執行個體。

餓漢:在初始化的時候,就建立了唯一的執行個體,不管是否需要用到。不需要自己加同步,一定産生唯一的執行個體。

餓漢式

//餓漢式----類加載的時候就把自己的私有的、靜态的成員儲存唯一的執行個體建立出來了
public class Simple {
    private Simple() {}//私有的構造方法  表示該類不能new出來
    private static Simple simple=new Simple();  // 私有的、靜态的成員儲存唯一的執行個體

    public static Simple getSimple() //通過靜态的方法來傳回上面建立時唯一執行個體

    {
        return simple;
    }
}
           

飽漢式

//飽漢式----在方法調用的時候的時候就把自己的私有的、靜态的成員儲存唯一的執行個體建立出來了
public class Simple {
    private Simple() {}//私有的構造方法  表示該類不能new出來
    private static Simple simple;  // 私有的、靜态的成員儲存唯一的執行個體 

    public static Simple getSimple() //通過靜态的方法來傳回上面建立時唯一執行個體

    {
        if (simple==null) {//判斷 執行個體是否為空
            
            simple =new Simple();//這樣的建立方法可能會導緻線程不安全建立的出多個執行個體
           
        }
        return simple;
    }
}
           

雙重校驗鎖

//雙重校驗鎖
public class Simple {
    private Simple() {}//私有的構造方法  表示該類不能new出來
    private static volatile Simple simple;  // volatile 關鍵字保證執行個體的在jvm中不會重排序

    public static Simple getSimple() //通過靜态的方法來傳回上面建立時唯一執行個體

    {
        synchronized (Simple.class) {//synchronized 表示給改對象加鎖 一個線程在操作的另外一個不會進來
            if (simple == null) {//判斷 執行個體是否為空

                simple = new Simple();

            }
        }
        return simple;
    }
}
           

繼續閱讀