TreeMap.Entry.setValue () против ConcurrentSkipListMap.replace () /. Put () - PullRequest
0 голосов
/ 26 мая 2020

Я хочу 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, не опасаясь странных проблем? Производительность здесь не проблема, карты относительно маленькие.

...