在工做中碰到有個異常:java.util.ConcurrentModificationExceptionjava
騰訊bugly工具給出的解決方案和說明以下:
該異常表示迭代器迭代過程當中,迭代的對象發生了改變,如數據項增長或刪除。 [解決方案]:因爲迭代對象不是線程安全,在迭代的過程當中,會檢查modCount是否和初始modCount即expectedModCount一致,若是不一致,則認爲數據有變化,迭代終止並拋出異常。常出現的場景是,兩個線程同時對集合進行操做,線程1對集合進行遍歷,而線程2對集合進行增長、刪除操做,此時將會發生ConcurrentModificationException異常。 具體方法:多線程訪問時要增長同步鎖,或者建議使用線程安全的集合: 1. 使用ConcurrentHashMap替換HashMap,CopyOnWriteArrayList替換ArrayList; 2. 或者使用使用Vector替換ArrayList,Vector是線程安全的。Vector的缺點:大量數據操做時,因爲線程安全,性能比ArrayList低.
我以前的報異常的代碼爲:
for (ListIterator<GridItem> it = VrAlbumGridItemDataStore.getSingleInstance().getPicList(currentPopPos).listIterator(); it.hasNext(); ) {
GridItem mGridItem = it.next();
}
注:VrAlbumGridItemDataStore.getSingleInstance().getPicList(currentPopPos)獲得的List列表數據正在某個線程變化, 全部致使了該異常。
修改後的代碼爲:
List<GridItem> _tmpGridList = VrAlbumGridItemDataStore.getSingleInstance().getPicList(currentPopPos);
int _listSize = _tmpGridList.size();
GridItem _gridItem = null;
for (int i = 0; i < _listSize; i++) {
_gridItem = _tmpGridList.get(i);
}
修改後,該異常就沒再出現了。
總結(一點經驗之談): 在之前碰到的幾個報該異常的地方,解決辦法都是:把數據源賦值給一箇中間變量_tmpGridList,後續操做作該變量,避免直接對數據源VrAlbumGridItemDataStore.getSingleInstance().getPicList(currentPopPos)作相關操做。