我有一个用例,我必须这样做
- 如果键不存在于 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);
}
你认为它正确且线程安全吗?
有没有更简单的方法?
最佳答案
您可以使用下面与您的等效的代码使其更短一些。我用数千个并发访问它的线程对它进行了一些压力测试:它按预期工作,执行了多次重试(循环)(显然,您永远无法通过并发世界中的测试证明正确性)。
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;
}
}
关于java - 结合 putIfAbsent 并替换为 ConcurrentMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279629/