單線程:
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聲明當前變量其他線程也可見(必須)