【发布时间】:2018-10-21 08:42:50
【问题描述】:
我有 3 个服务器和一个发送消息的客户端。我实现了一个 BFT 算法。 所以我有这部分代码
int tam = 0;
if (unordered.size() <= maxOrderSize) {
tam = unordered.size();
} else {
tam = maxOrderSize;
}
HashMap<String, byte[]> prop = new HashMap<String, byte[]>(tam);
Iterator<String> it = unordered.keySet().iterator();
for (int i = 0; i < tam; i++) {
if (it.hasNext()) {
String id = it.next();
prop.put(id, unordered.get(id));
it.remove();
unordered.remove(id);
}
}
在运行时对象被导入并从我的地图中删除无序。 我还想提一下,定义了无序:
Map<String, byte[]> unordered = Collections.synchronizedMap(new HashMap<String, byte[]>());
但它突然创建了这个异常:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.remove(HashMap.java:1456)
at edu.bft.comm.layer.BatchControl.createOrderMessage(BatchControl.java:123)
at edu.bft.comm.layer.BatchControlTPM.run(BatchControlTPM.java:24)
知道为什么会这样吗?
EDIT1:我试图删除该行:unordered.remove(id);
我得到了那个错误:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
at edu.bft.comm.layer.BatchControl.createOrderMessage(BatchControl.java:120)
at edu.bft.comm.layer.BatchControlTPM.run(BatchControlTPM.java:24)
EDIT2:我还想提一下,当我迭代 unordered 时,可能会添加一些新对象,而新消息来自客户端。
【问题讨论】:
-
整个
for-loop 似乎是不必要和错误的。while(it.hasNext(){ String id = it.next(); ...}不是更有意义吗? -
是的,正如 Kevin 建议的那样,它可能应该是一个 while 循环。此外,您真正想要的是对
entrySet()的迭代,而不是keySet()。通过使用错误的迭代器,您需要在prop.put(...)中进行集合查找。也许通过使用 entrySet 的迭代器,它的remove()操作可能会起作用。 -
我更新我的第一篇文章检查完整的代码。和编辑2。谢谢
-
@KevinAnderson 不,我不想删除所有对象,只想删除 tam 中指定的特定数字
-
@MarcusK。检查这个输出pastebin.com/eCFLd3Rn我在for循环之前添加了一个打印,在for循环之后添加了一个打印这个输出已经删除了unordered.remove(id)行;
标签: java dictionary exception iterator