【问题标题】:Have ConcurrentModificationException even with synchronized keyword used即使使用了同步关键字也有 ConcurrentModificationException
【发布时间】:2013-02-26 09:38:51
【问题描述】:

我有一个从网络服务返回的我定义的对象列表(network svc 将更新此列表)。 在某个时间点,我想在我的列表视图中呈现我已经拥有的内容。 我有以下代码:

List<MyObject> myObjects = MyService.getInstance().getListOfMyObject()

因为我有另一个线程会更新 myObjects 列表,所以我想避免并发修改异常。 我有:

 List<MyObject> clonedList = null;
 synchronized(myObjects){
         clonedList = MyListUtils.cloneList(myObjects)
 }

MyListUtils 中的cloneList() 函数实现方式很简单:

public static <T extends ICloneable<T>> List<T> cloneList(final List<T> source){
    List<T> result  = new ArrayList<T>();
    for(T t : source){
       T newObject = t.clone();
       result.add(newObject);
    }
    return result;
}

-不用关心ICloneable接口,我用这个ICloneable来标记东西。

我得到了这个例外

03-11 16:07:11.370: E/AndroidRuntime(8076): FATAL EXCEPTION: main
03-11 16:07:11.370: E/AndroidRuntime(8076): java.util.ConcurrentModificationException
03-11 16:07:11.370: E/AndroidRuntime(8076):  at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
03-11 16:07:11.370: E/AndroidRuntime(8076):  at xxx.utilities.MyListUtils.cloneList(CollectionUtils.java:120)

不知道有什么问题?我没有调用任何函数来修改对象,我只是“克隆”它,据我所知,这不会改变我对象中的任何一个位。 任何想法表示赞赏,谢谢。

【问题讨论】:

    标签: android list exception object concurrency


    【解决方案1】:

    根据某些线程,我可以找到 java.util.ConcurrentModificationException in Android animationHow to handle ConcurrentModificationException in Android

    如果您正在迭代列表,同时其他一些线程也在修改它.. 这也会导致 ConcurrentModificationException.. 所以您可以尝试使用 sychronizing 传递的 cloneList 方法列表的对象..

    synchronized(source)
    {
        // make a copy
    }
    

    我希望您已经在修改数据的线程中执行此操作...

    【讨论】:

    • 是的,我做到了(正如您在我编辑的帖子中看到的那样),我已将源代码放在同步块中。但它仍然抛出异常。
    • 你能把修改数据的代码也贴出来吗……你也同步那部分吗……
    • MyService.getInstance().updateListOfMyObject() --> 这个函数是我修改数据的地方(我从网络连接更新新数据)。我有一个对象列表来缓存我的对象,用于更新新对象和检索
    • 你能把updateListOfMyObject()方法的相关代码贴出来吗?
    • 我只是从网络连接中读取数据,然后重建为 object ,然后将这些新对象更新到缓存在 MyService 中的列表中。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多