【錯誤緣由】:
當某個線程對一個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上,而是加在了方法聲明上,是不起做用的。