объединить putIfAbsent и заменить на ConcurrentMap

У меня есть вариант использования, в котором я должен

  • вставить новое значение, если ключ не существует в ConcurrentHashMap
  • заменить старое значение новым значением, если ключ уже существует в ConcurrentHashMap, где новое значение получено из старого значения (не затратная операция)

Я могу предложить следующий код:

public void insertOrReplace(String key, String value) {
        boolean updated = false;
        do {
            String oldValue = concurrentMap.get(key);
            if (oldValue == null) {
                oldValue = concurrentMap.putIfAbsent(key, value);
                if (oldValue == null) {
                    updated = true;
                }
            }
            if (oldValue != null) {
                final String newValue = recalculateNewValue(oldValue, value);
                updated = concurrentMap.replace(key, oldValue, newValue);
            }
        } while (!updated);
    }

Как вы думаете, это правильно и потокобезопасно -?

Есть ли более простой способ?

17
задан Holger 23 April 2012 в 11:27
поделиться