połącz putIfAbsent i zamień na ConcurrentMap
Mam walizkę, gdzie muszę
wstaw nową wartość, jeśli klucz nie istnieje na mapie ConcurrentHashMapzastąp starą wartość nową wartością, jeśli klucz już istnieje w ConcurrentHashMap, gdzie nowa wartość jest pochodną starej wartości (nie jest to kosztowna operacja)Mam do zaoferowania następujący kod:
<code>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); } </code>
Czy uważasz, że jest poprawny i bezpieczny w wątkach?
Czy istnieje prostszy sposób?