gpt4 book ai didi

java - 像短路运算符一样使用 putIfAbsent

转载 作者:行者123 更新时间:2023-12-02 08:16:33 26 4
gpt4 key购买 nike

是否可以使用 putIfAbsent 或其任何等效项(如短路运算符)。

myConcurrentMap.putIfAbsent(key,calculatedValue)

我希望如果已经存在计算值,则不应再次计算它。默认情况下 putIfAbsent 仍会每次进行计算,即使它实际上不会再次存储该值。

最佳答案

遗憾的是,Java 不允许任何形式的短路(除了内置情况)——所有方法调用都会导致参数在控制权传递给方法之前被完全求值。因此你不能用“正常”语法来做到这一点;您需要手动将计算包装在 Callable 或类似的内部,然后显式调用它。

<小时/>

不过,在这种情况下,我发现很难看出它是如何工作的。 putIfAbsent 的工作原理是原子、非阻塞操作。如果它要做你想做的事,事件的顺序大致是:

  1. 检查 map 中是否存在key(本示例假设不存在)
  2. 评估calculatedValue(考虑到问题的上下文,可能会很昂贵)
  3. 将结果放入 map

如果该值在第二步中尚不存在,则不可能是非阻塞的 - 同时调用此方法的两个不同线程只有在发生阻塞时才能正确执行。此时,您也可以只使用具有实现灵 active 的同步块(synchronized block);您绝对可以通过一些简单的锁定来实现您想要的功能,如下所示:

private final Map<K, V> map = ...;

public void myAdd(K key, Callable<V> valueComputation) {
synchronized(map) {
if (!map.containsKey(key)) {
map.put(key, valueComputation.call());
}
}
}

关于java - 像短路运算符一样使用 putIfAbsent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6290597/

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