W kodzie z listą 5.19 książki Brian Goetz Współbieżność w praktyce przedstawia swoją ukończoną wątek bezpieczną klasą Memoizer.W praktyce Współdziałanie Briana Goetza w praktyce, dlaczego jest jakiś czas (prawda) w ostatecznym przykładzie skalowalnej pamięci podręcznej?
Myślałem zrozumiałem kodu w tym przykładzie, oprócz tego, że nie rozumiem, co
while (true)
jest na początku metody
public V compute(final A arg) throws InterruptedException
.
Dlaczego kod wymaga pętli while?
Oto cały kod przykładowy
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());
}
}
}
}
To samo uderzyło mnie, gdy po raz pierwszy przeczytałem. Myślę, że zgłosiłem to http://www.javaconcurrencyinpractice.com/errata.html, ale nigdy nie otrzymałem odpowiedzi. – jabley
Tak, może książka musi być bardziej wyraźna na temat tej cechy rozwiązania (spróbuj ponownie po anulowaniu). – russelldb