代码之家  ›  专栏  ›  技术社区  ›  TYZRPVX

由List.AdDALL生成的遍历列表是否产生Java中的CONTRONTRORATIOFIGATION异常?

  •  1
  • TYZRPVX  · 技术社区  · 6 年前

    以下代码发布已生成 ConcurrentModificationException , newMR 确保不会在循环中修改, mkrs 线程在并发环境中不安全。众所周知 List.addAll 由执行 System.arraycopy 这是JVM中的固有方法。是否穿越 List 生成者 列表.addall 生产 当前修改例外 在Java中?

    ArrayList<Foo> mkrs = mrm.getFooPush();
    ArrayList<Foo> newMR = new ArrayList<Foo>(mkrs.size());
    newMR.addAll(mkrs);
    for (Foo mkr : newMR) {
        if (mkr != null && mkr instanceof PushRecommend) {
            PushRecommend pr = (PushRecommend) mkr;
            recommendList.add(new MayKnowMessage(pr));
        }
    }
    

    发布在Android机器上发生的异常堆栈跟踪。注意 (ProGuard:433) 这条线在哪 for (Foo mkr : newMR) 书面的。

    java.util.ConcurrentModificationException:
    java.util.ArrayList$Itr.next(ArrayList.java:837)
    NewFriendManager.void loadNewFriendMsg(boolean)(ProGuard:433)
    NewFriendManager.void reloadNewFriendMsg()(ProGuard:308)
    NewFriendManager.boolean handleMessage(android.os.Message)(ProGuard:144)
    android.os.Handler.dispatchMessage(Handler.java:106)
    android.os.Looper.loop(Looper.java:232)
    android.os.HandlerThread.run(HandlerThread.java:61)
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Joop Eggen    6 年前

    newMR.addAll(mkrs); mkrs, mrm.getFooPush()

    Collections.synchronizedList(list)

        2
  •  1
  •   Stephen C    6 年前

    javadoc ArrayList.addAll

    newMR.addAll(mkrs);
    

    addAll mkrs

    addAll(mkrs)