單例模式

單線程:

 public static Object getInstant(){
        if(mIntants == null){
            mIntance = new Object();
        }
        return mIntance;
    }

說明:單線程比較簡單,只是需要保證第一次new對象,後續複用即可,常見於Application的單例

多線程:

在多線程情況下,如果2個線程同時加載,就肯能出現異常;

解決方案1:

構造時初始化

 private static Object o = new Object();

    public static Object getInstant(){
        return o;
    }

解決方案2:

使用同步:

public static synchronized Object getInstant() {
        if (mInstance == null) {
            mInstance = new Object();
        }
        return mInstance;
    }

問題:每次獲取都會觸發同步,效率低下、

解決方案3:

雙重檢查:

private volatile static Object mInstance;

    public static synchronized Object getInstant(){
        if(mInstance == null){
            synchronized (Object.class){
                if(mInstance == null){
                    mInstance = new Object();
                }
            }

        }
        return mInstance;
    }

說明:volidate聲明當前變量其他線程也可見(必須)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章