gpt4 book ai didi

java - 在 Brian Goetz 的 Concurrency In Practice 中,为什么可伸缩缓存的最后一个例子中有 while(true)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:08 26 4
gpt4 key购买 nike

在 Brian Goetz 的书并发实践中的代码 list 5.19 中,他展示了他完成的线程安全 Memoizer 类。

我以为我理解了这个例子中的代码,只是我不明白

while ( true )

是在

的开头
public V compute(final A arg) throws InterruptedException

方法。

为什么代码需要while循环?

这里是完整的代码示例

public class Memoizer<A, V> implements Computable<A, V> {
private final ConcurrentMap<A, Future<V>> cache
= new ConcurrentHashMap<A, Future<V>>();
private final Computable<A, V> c;

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

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>() {
public V call() throws InterruptedException {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<V>(eval);
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) {
throw launderThrowable(e.getCause());
}
}
}
}

最佳答案

永恒循环在 CancellationException 上重试。如果抛出任何其他异常,将停止执行。

Biotext dot org 有一个 blog entry同一个问题。

关于java - 在 Brian Goetz 的 Concurrency In Practice 中,为什么可伸缩缓存的最后一个例子中有 while(true)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3882342/

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