双重加锁检查机制的应用
双重加锁检查和单例
1.近日,在做项目中实现集合的异步回调功能,使用了双重加锁检查的机制解决同步问题,原先代码如下:
public void obtainNewestInterface(Context context, UpdateBean config, ObtainListener obtainListener) { if (mUpdateObject == null) { mObtainListeners.add(obtainListener); if (mObtainListeners.size() <= 1) { this.execute(null, context, config); } } else { obtainListener.onSucceed(mUpdateObject); } } @Override public void onPostExecute(Object result, String taskid) { if (result != null) { mUpdateObject = (IAd) result; for (ObtainListener listener : mObtainListeners) { listener.onSucceed(mUpdateObject); mObtainListeners.clear(); } } } public void obtainNewestInterface(Context context, UpdateBean config, ObtainListener obtainListener) { if (mUpdateObject == null) { synchronized (mObtainListeners) { mObtainListeners.add(obtainListener); if (mObtainListeners.size() <= 1) { this.execute(null, context, config); } } } else { obtainListener.onSucceed(mUpdateObject); }} @Override public void onPostExecute(Object result, String taskid) { if (result != null) { mUpdateObject = (IAd) result; synchronized (mObtainListeners) { for (ObtainListener listener : mObtainListeners) { listener.onSucceed(mUpdateObject); } mObtainListeners.clear(); } } } public void obtainNewestInterface(Context context, UpdateBean config, ObtainListener obtainListener) { if (mUpdateObject == null) { synchronized (mObtainListeners) {//代码加入判空 if (mUpdateObject != null) { obtainListener.onSucceed(mUpdateObject); } else { mObtainListeners.add(obtainListener); if (mObtainListeners.size() <= 1) { this.execute(null, context, config); } } } } else { obtainListener.onSucceed(mUpdateObject); } }//以下代码不变 @Override public void onPostExecute(Object result, String taskid) { if (result != null) { mUpdateObject = (IAd) result; synchronized (mObtainListeners) { for (ObtainListener listener : mObtainListeners) { listener.onSucceed(mUpdateObject); } mObtainListeners.clear(); } } }