考虑以下代码:
ConcurrentHashMap<String, Value> map = new ConcurrentHashMap<>();
boolean foo(String key) {
Value value = map.get(key);
if (value == null) {
value = map.putIfAbsent(key, new Value());
if (value == null) {
// do some stuff
return true;
}
}
// do some other stuff
return false;
}
假使,假设foo()
由多个线程同时调用。还假设调用new Value()
价格昂贵。代码很冗长,仍然会导致冗余Value
创建的对象。上述逻辑能否以保证不冗余的方式实现Value
创建对象(即new Value()
最多被调用一次)?我正在寻找一个干净的实现 - 无需显式获取锁的最少代码。
computeIfAbsent
可能是一个很好的选择,但是它的返回语义不符合所需的逻辑。
一些完成这项工作的最少代码:
boolean foo(String key) {
AtomicBoolean flag = new AtomicBoolean();
Value value = map.computeIfAbsent(key, k -> {flag.set(true); return new Value();});
if (flag.get()) {
// do some stuff
} else {
// do some other stuff
}
return flag.get();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)