如何以computeIfAbsent效率实现Map putIfAbsent语义?

2024-01-10

考虑以下代码:

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(使用前将#替换为@)

如何以computeIfAbsent效率实现Map putIfAbsent语义? 的相关文章

随机推荐