Я хочу l oop поверх упорядоченной (ключ, значение) -map и изменить значения записи.
В сценарии без параллелизма я бы сделал
for (Map.Entry<Date, Double> current : map.entrySet()) {
// do stuff
// double newValue = [...]
current.setValue(newValue);
}
Я обнаружил, что иногда получаю странные ConcurrentModificationException
s в других частях моего кода. Я пока не мог решить эту проблему, изменив структуру моего кода (это приложение Android), чтобы сделать его более поточно-ориентированным.
Затем я обнаружил, что ConcurrentSkipListMap
может быть решением моей проблемы . Однако следующий код, который, как я полагал, делает практически то же самое, вызывает какое-то странное поведение (при котором я тоже не мог воспроизвести, что происходит):
for (Map.Entry<Date, Double> current : map.entrySet()) {
// do stuff
// double newValue = [...]
map.remove(current.getKey());
current = new ConcurrentSkipListMap.SimpleEntry<>(current.getKey(), newValue);
map.put(current.getKey(), current.getValue());
}
Безопасно ли выполнять фрагмент кода № 3 вместо фрагмента № 1, не опасаясь странных проблем? Производительность здесь не проблема, карты относительно маленькие.