gpt4 book ai didi

java - 带有同步列表的 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-02 10:01:11 24 4
gpt4 key购买 nike

我在以下情况下收到 ConcurrentModificationException 错误。线路发生这种情况的地方标有“<-------- ConcurrentModificationException”

  • 我有一个主线程,它从列表中读取如下内容:

    List<ThemeCacheIndex> list = Collections.synchronizedList(themeCacheList);
    synchronized (list) {
    Iterator<ThemeCacheIndex> it = list.iterator();
    while (it.hasNext()) {
    ThemeCacheIndex themeCacheIndex = it.next(); <-------- ConcurrentModificationException
    doSomething();
    }
    }
  • 我有一个从该列表中删除的 AsyncTask:

     @Override
    protected String doInBackground(String... params) {
    someElementsToRemove = calculateWhichElementsToRemove();
    for(int i=0 ; i < someElementsToRemove.size() ; i++){
    themeCacheList.remove(someElementsToRemove.get(i));
    }
    }

我可以想象,它会遇到并发情况,但我想通过主线程上的同步列表来防止这种情况。

看来我没有理解多线程和共享对象的概念。

有人可以帮我解决这个问题吗?我怎样才能避免这种冲突?

最佳答案

引用集合 Javadoc :

Returns a synchronized (thread-safe) list backed by the specified list. In order to guarantee serial access, it is critical that all access to the backing list is accomplished through the returned list.

如果您的 AsyncTask 修改了 themeCacheList,则您所做的同步将无济于事,因为后备列表已被修改。

关于java - 带有同步列表的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55616745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com