Use Java 8 API ConcurrentMap#computeIfAbsent().

This commit is contained in:
Gary Gregory 2022-03-20 13:49:09 -04:00
parent 4a5ef835cc
commit cb6676b1bb

View File

@ -112,16 +112,11 @@ public Memoizer(final Computable<I, O> computable, final boolean recalculate) {
@Override @Override
public O compute(final I arg) throws InterruptedException { public O compute(final I arg) throws InterruptedException {
while (true) { while (true) {
Future<O> future = cache.get(arg); Future<O> future = cache.computeIfAbsent(arg, k -> {
if (future == null) {
final FutureTask<O> futureTask = new FutureTask<>(() -> computable.compute(arg)); final FutureTask<O> futureTask = new FutureTask<>(() -> computable.compute(arg));
future = cache.putIfAbsent(arg, futureTask); futureTask.run();
if (future == null) { return futureTask;
future = futureTask; });
futureTask.run();
}
}
try { try {
return future.get(); return future.get();
} catch (final CancellationException e) { } catch (final CancellationException e) {