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());
}
}
添加回答
举报