java.util.ConcurrentModificationException 異常解決辦...

【錯誤緣由】:
當某個線程對一個Collection / Map進行遍歷時,另一個線程對其進行了修改。
通常狀況下,map裏面存放的對象越多、讀寫越頻繁,這種異常出現的概率越大。
拿我遇到的狀況舉例:在一個競價系統中,我用一個全局靜態HashMap作緩存使用,裏面存放用戶報價記錄。
前臺用戶報價實時寫進該HashMap,同時會實時讀取記錄並next()方法進行遍歷顯示。

正常使用時,系統沒有任何問題。但在進行壓力測試時,併發數一旦超過200,就會拋出異常:
java.util.ConcurrentModificationException



【解決方法】:
給讀寫該map的方法加入同步約束:

public static Map map = new HashMap();

public static List mapToList(){
List list = new ArrayList();
synchronized (map)   {
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
list.add(map.get(it.next()));
}
}
}

public static void addToMap(Record obj){
synchronized(map) {
map.put(obj.getID(), obj);
}

}

紅色部分是我後來加入的,加入後,就沒再拋出異常。
注意,若是 synchronized 不是加載了map上,而是加在了方法聲明上,是不起做用的。
相關文章
相關標籤/搜索