3 回答

TA貢獻1891條經驗 獲得超3個贊
異步任務代碼沒有問題。對“主”線程代碼執行此操作:
synchronized (themeCacheList) {
Iterator<ThemeCacheIndex> it = themeCacheList.iterator();
while (it.hasNext()) {
ThemeCacheIndex themeCacheIndex = it.next();
doSomething();
}
}
如您所見,我已經刪除了,因為它是多余的,我直接在 上同步。Collections.synchronizedListthemeCacheList

TA貢獻1863條經驗 獲得超2個贊
不確定我有一個好的解決方案,但我想這2個例子顯示了問題和可能的解決方案?!翱赡艿闹貜汀贝鸢笡]有顯示任何解決方案,而只是解釋了問題所在。
@Test
public void testFails(){
List<String> arr = new ArrayList<String>();
arr.add("I");
arr.add("hate");
arr.add("the");
arr.add("ConcurrentModificationException !");
Iterator i = arr.iterator();
arr.remove(2);
while(i.hasNext()){
System.out.println(i.next());
}
}
@Test
public void testWorks(){
List<String> arr = new CopyOnWriteArrayList<>();
arr.add("I");
arr.add("hate");
arr.add("the");
arr.add("ConcurrentModificationException !");
Iterator i = arr.iterator();
arr.remove(2);
while(i.hasNext()){
System.out.println(i.next());
}
}
添加回答
舉報