gpt4 book ai didi

java - Java中遍历List.addAll生成的List会产生ConcurrentModificationException吗?

转载 作者:行者123 更新时间:2023-11-30 02:06:34 31 4
gpt4 key购买 nike

下面的代码产生了 ConcurrentModificationException ,确保 newMR 在循环中不被修改,mkrs 在并发环境中是不安全的线程。众所周知,List.addAll是由System.arraycopy实现的,它是JVM中的内部方法。在Java中遍历List.addAll生成的List是否会产生ConcurrentModificationException

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)

最佳答案

newMR.addAll(mkrs); 迭代 mkrs, mrm.getFooPush()。如果该列表在 addAll 期间发生更改,您会收到该消息。

您需要有一个并发安全列表(在 getFooPush 内)或更好的数据结构。就像一个队列,如果消息添加在末尾,并且您从前面被过滤(在 PushRecommend 上)。

那么就不需要复制了。

正如已经提到的,原始数据结构可以通过Collections.synchronizedList(list)来保证安全。

关于java - Java中遍历List.addAll生成的List会产生ConcurrentModificationException吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51155601/

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