为了账号安全,请及时绑定邮箱和手机立即绑定

并发修改具有同步列表的异常

并发修改具有同步列表的异常

慕桂英546537 2022-09-28 16:23:32
在以下情况下,我收到并发修改异常错误。发生这种情况的行标记为“并发修改例外<--------”我有一个主线程,从列表中读取如下:List<ThemeCacheIndex> list = Collections.synchronizedList(themeCacheList);synchronized (list) {    Iterator<ThemeCacheIndex> it = list.iterator();    while (it.hasNext()) {        ThemeCacheIndex themeCacheIndex = it.next();  <-------- ConcurrentModificationException        doSomething();    }}我有一个从此列表中删除的异步任务: @Override    protected String doInBackground(String... params) {        someElementsToRemove = calculateWhichElementsToRemove();        for(int i=0 ; i < someElementsToRemove.size() ; i++){            themeCacheList.remove(someElementsToRemove.get(i));        }    }我可以想象,它涉及并发情况,但我想通过在主线程上同步列表来防止这种情况。似乎我不理解多线程和共享对象的概念。有人可以帮助我解决这个问题吗?如何防止此冲突?
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

异步任务代码没有问题。对“主”线程代码执行此操作:


synchronized (themeCacheList) {

    Iterator<ThemeCacheIndex> it = themeCacheList.iterator();

    while (it.hasNext()) {

        ThemeCacheIndex themeCacheIndex = it.next();

        doSomething();

    }

}

如您所见,我已经删除了,因为它是多余的,我直接在 上同步。Collections.synchronizedListthemeCacheList


查看完整回答
反对 回复 2022-09-28
?
小唯快跑啊

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());

    }

}


查看完整回答
反对 回复 2022-09-28
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

引用爪哇语Collections

返回由指定列表支持的同步(线程安全)列表。为了保证串行访问,通过返回的列表完成对支持列表的所有访问至关重要。

如果您修改了 ,则像您所做的那样进行同步将无济于事,因为备份列表已被修改。AsyncTaskthemeCacheList


查看完整回答
反对 回复 2022-09-28
  • 3 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信