Java中的List并發(fā)修改異常(ConcurrentModificationException)通常是因?yàn)樵诒闅v一個(gè)List的過程中,另一個(gè)線程或者同一個(gè)線程試圖修改這個(gè)List。為了解決這個(gè)問題,你可以使用以下方法:
synchronized
關(guān)鍵字:在遍歷和修改List的代碼塊上添加synchronized
關(guān)鍵字,確保同一時(shí)間只有一個(gè)線程能夠訪問這個(gè)List。synchronized (list) {
for (Object obj : list) {
// do something
}
}
// 在其他地方修改List時(shí)也需要同步
synchronized (list) {
list.add(newObj);
}
CopyOnWriteArrayList
:這是一個(gè)線程安全的List實(shí)現(xiàn),它在修改操作時(shí)會(huì)創(chuàng)建一個(gè)新的List副本,從而避免并發(fā)修改異常。但是,這種方法在大量修改操作時(shí)可能會(huì)導(dǎo)致性能下降,因?yàn)槊看涡薷亩夹枰獜?fù)制整個(gè)List。import java.util.concurrent.CopyOnWriteArrayList;
List<Object> list = new CopyOnWriteArrayList<>();
// 在多線程環(huán)境下,可以直接遍歷和修改,不會(huì)出現(xiàn)ConcurrentModificationException
for (Object obj : list) {
// do something
}
list.add(newObj);
Iterator
的remove()
方法:如果你只是想在遍歷過程中刪除元素,可以使用Iterator
的remove()
方法,而不是直接在List上調(diào)用remove()
。Iterator<Object> iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
if (shouldRemove(obj)) {
iterator.remove();
}
}
forEach()
和removeIf()
方法:這些方法內(nèi)部實(shí)現(xiàn)了遍歷和刪除的邏輯,可以在不拋出ConcurrentModificationException
的情況下進(jìn)行刪除操作。// 使用forEach()方法遍歷
list.forEach(obj -> {
// do something
});
// 使用removeIf()方法刪除符合條件的元素
list.removeIf(obj -> shouldRemove(obj));
根據(jù)你的具體需求和場(chǎng)景,選擇合適的方法來解決并發(fā)修改異常。