gpt4 book ai didi

java - 如何用computeIfAbsent效率实现Map putIfAbsent语义?

转载 作者:行者123 更新时间:2023-12-01 10:14:37 24 4
gpt4 key购买 nike

考虑以下代码:

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();
}

关于java - 如何用computeIfAbsent效率实现Map putIfAbsent语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62672809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com