Я хочу:ConcurrentHashMap: как заменить значение записи, только если текущее значение Smalle
- Добавить запись к ConcurrentHashMap, если нет записи для ключа или
- Замените значение для ключа, только если текущее значение меньше.
я придумал следующий код, но синус имеет в то время (правда), это выглядит страшно мне :)
Я хотел, чтобы проверить его с вами, ребята. Как вы думаете, он работает?
// Input: map, k, t
while (true) {
if (map.containsKey(k)) {
current = map.get(k);
if (current != null && current < t) {
if (map.replace(k, current, t))
break;
} else if (current != null && current >= t) {
break;
}
} else {
pre = map.putIfAbsent(k, t);
if (pre == null)
break;
}
}
Вы попробовали? Запустили ли вы его в своем отладчике IDE и пропустили его по одной строке за раз? Пожалуйста, сделайте это, это будет намного более образовательным, чем кто-то скажет вам. И, кстати, нет необходимости в 'while (true)' (или в цикле любого типа) вообще. –
использовать 'Map.entrySet()' для итерации –
@JimGarrison, почему мне не нужно пока (правда)? Предположим, что поток хочет записать t, но на карте уже есть ключ, поэтому он переходит к первому If. затем, когда он заменяется, заменитель возвращает false, потому что значение изменилось другим потоком тем временем на значение, превышающее текущее, но меньшее, чем t. Так как поток «хочет» написать t (поскольку t выше), он должен начать все заново. –