У меня есть 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: Также яхочу упомянуть, что, хотя я итерирую неупорядоченный , некоторые новые объекты могут добавляться, в то время как новые сообщения приходят от клиента.