【发布时间】:2016-07-20 05:59:00
【问题描述】:
我想:
- 在 ConcurrentHashMap 中添加一个条目,如果该键没有条目,或者
- 仅当当前值较小时才替换键的值。
我想出了下面的代码,但它确实有 while (true),它看起来对我来说很可怕 :)
我想和你们一起检查一下。你认为它有效吗?
// Input: map, k, t
while (true) {
if (map.containsKey(k)) {
current = map.get(k);
if (current != null && current < t) {
if (map.replace(k, current, t))
break;
} else if (current != null && current >= t) {
break;
}
} else {
pre = map.putIfAbsent(k, t);
if (pre == null)
break;
}
}
【问题讨论】:
-
你试过了吗?您是否在您的 IDE 调试器中运行它并一次通过它一行?请这样做,这将比有人告诉你更具教育意义。顺便说一句,根本不需要
while(true)(或任何类型的循环)。 -
使用
Map.entrySet()进行迭代 -
@JimGarrison 为什么我不需要 while (true)?假设一个线程想要写 t,但是 map 已经有了 key,所以它去第一个 If。然后在替换时,replace返回false,因为同时该值已被另一个线程更改为高于current但小于t的值。由于线程“想要”写入 t(因为 t 更高),它需要重新开始。