这是指对in this thread
提出的问题的公认解决方案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;
}
}
我很想彻底了解代码。
我相信putIfAbsent
和replace
可以被视为复合操作。对象oldValue
没有显式同步,这个复合操作是原子的吗?或者仅仅因为for
循环,它保证了原子性?循环到底是做什么的?它会导致无限循环使方法永远不会结束吗?
答案 0 :(得分:0)
首先,原始问题引入了一些奇怪的代码。不确定它有什么好处,但让我们把它放在一边。
第二件事,所选答案和你在这里复制粘贴的答案只是与问题中代码相同的不同方式。
那么,这个(奇异)方法做了什么:
为什么我们需要循环呢?如果2个线程正在重新计算该值并进行“一起”替换,则只有1个将成功,因此从该方法返回。 “松动”线程需要再次通过该过程。可能会在putIfAbsent
调用中获得一个新值,并重新计算要替换的新值,这次可能没问题。
有几点需要注意:
ConcurrentMap
的{{1}}和putIfAbsent
方法的API。