private synchronized void afterRemoveValue(V value) {
        try {
            boolean completed = completedSet.remove(value);
            if (completed) {
                stats.markRemoveCompleted(cacheName);
                totalSize.addAndGet(-value.size().get());
                value.close();
            } else {
                stats.markRemoveNotCompleted(cacheName);
                removedSet.add(value);
            }
        } catch (Throwable e) {
            LOGGER.error("Failed to remove {}", value, e);
        }
    }
An asynchronous LRU cache that supports asynchronous value computation.

@param <K> key type
@param <V> value type, NOTE: V must not override equals and hashCode
s3stream/src/main/java/com/automq/stream/s3/cache/AsyncLRUCache.java