gpt4 book ai didi

java - 两个线程同时执行cache.putIfAbsent会发生什么?

转载 作者:行者123 更新时间:2023-11-30 09:14:57 25 4
gpt4 key购买 nike

我正在学习 Java 并发实践,但一些代码让我感到困惑:

private final ConcurrentHashMap<A, Future<V>> cache = new ConcurrentHashMap<A, Future<V>>();

private final Computable<A, V> c;

public Memoizer(Computable<A, V> c) {
this.c = c;
}

/* (non-Javadoc)
* @see com.demo.buildingblocks.Computable#compute(java.lang.Object)
*/
@Override
public V compute(final A arg) throws InterruptedException {

while (true) {
Future<V> f = cache.get(arg);
if (f == null) {
//
Callable<V> eval = new Callable<V>() {
@Override
public V call() throws Exception {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<V>(eval);
// what will happen when two threads arrive here at the same time?
f = cache.putIfAbsent(arg, ft);
if (f == null) {
f = ft;
ft.run();
}
}
try {
return f.get();
} catch (CancellationException e) {
cache.remove(arg, f);
} catch (ExecutionException e) {
launderThrowable(e);
}
}
}

我就是看不懂,因为putIfAbsent只能保证put操作是原子的,而且都返回null,如果两个线程都能进入 >运行方法?

最佳答案

putIfAbsent 保证线程安全,不仅是因为它不会破坏您的数据,而且还因为它总是在一个最新的状态下工作数据副本的日期。

此外,如果存在这样的值,它不会返回 map 中的先前值。因此第一次调用 putIfAbsent 会成功,并返回 null,因为没有先前的值。第二次调用将阻塞,直到第一次调用成功,然后返回放入映射中的第一个值,导致永远不会调用第二个 run()

关于java - 两个线程同时执行cache.putIfAbsent会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20171896/

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