java-ArrayList.addAll()ConcurrentModificationException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-ArrayList.addAll()ConcurrentModificationException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1874字,纯文字阅读大概需要3分钟。
内容图文
在Java 8(OpenJDK)中实现一种Kademlia存储桶时,我遇到了一些非常奇怪的问题.
我需要从所谓的“桶”中至少获取特定数量的物品.
但这不是问题.
不知何故,有时在ArrayList上执行closest.addAll()时会遇到ConcurrentModificationException,尽管它仅在单个线程中使用,而我没有进行迭代或类似的操作.
你知道如何帮助我吗?
这是我的代码(我知道那是一团糟!):
List<Neighbour> getClosest(Node n, int num) {
ArrayList<Neighbour> closest = new ArrayList<>();
int missing;
int walkDown = n.getBucket(me);
int walkUp = walkDown + 1;
boolean pleaseBreak = true;
while (true) {
missing = num - closest.size();
if (missing <= 0) {
return closest;
}
if (walkUp >= 0 && walkUp < 160) {
List<Neighbour> l = buckets[walkUp].getClosest(missing);
closest.addAll(l);
if (closest.size() >= missing) {
return closest;
}
walkUp++;
pleaseBreak = false;
}
if (walkDown >= 0 && walkDown < 160) {
List<Neighbour> l = buckets[walkDown].getClosest(missing);
closest.addAll(l);
if (closest.size() >= missing) {
return closest;
}
walkDown--;
pleaseBreak = false;
}
if (pleaseBreak) {
return closest;
}
pleaseBreak = true;
}
}
解决方法:
ConcurrentModificationException实际上意味着您通过在迭代时修改列表来破坏迭代规则.
Note that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception.
也就是说,很清楚是什么导致了此问题.该方法填充的新列表最接近,它必须是正在修改的l.
有两种选择:
>另一个线程正在执行此操作.
>您已经在列表l中打开了一个迭代器.
假设它不是1(或者您可能已经提到过),我将寻求:
您的getClosest方法将返回正在迭代和/或修改的列表的子列表,并且addAll还将尝试对其进行迭代.
要解决此问题,请使getClosest返回该子列表的副本.
内容总结
以上是互联网集市为您收集整理的java-ArrayList.addAll()ConcurrentModificationException全部内容,希望文章能够帮你解决java-ArrayList.addAll()ConcurrentModificationException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。