在实现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;
}
}
buckets[walkDown]
是什么类型?你能展示一下getClosest(missing)
的代码吗? - Eran