我有一个用例,我必须
我提供以下代码:
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); }
您认为它是正确的并且是线程安全的吗?
有没有更简单的方法?
您可以使用下面与您的代码等效的代码来使其短一些。我已经对数以千计的线程进行并发访问进行了一些压力测试:它按预期运行,并执行了许多重试(循环)(显然,您无法在并发世界中通过测试来证明其正确性)。
public void insertOrReplace(String key, String value) { for (;;) { String oldValue = concurrentMap.putIfAbsent(key, value); if (oldValue == null) return; final String newValue = recalculateNewValue(oldValue, value); if (concurrentMap.replace(key, oldValue, newValue)) return; } }