【发布时间】:2010-12-24 21:19:25
【问题描述】:
Brian Goetz 的 Java Concurrency In Practice 提供了一个用于并发使用的高效可扩展缓存示例。显示类 Memoizer 实现的示例的最终版本(第 108 页)显示了这样的缓存。我想知道为什么这个类没有用@ThreadSafe 注释?缓存的客户端,Factorizer 类使用@ThreadSafe 正确注释。附录指出,如果一个类没有使用@ThreadSafe 或@Immutable 注释,则应该假定它不是线程安全的。 Memoizer 似乎是线程安全的。
Memoizer 的代码如下:
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());
}
}
}
}
【问题讨论】:
标签: java concurrency thread-safety