不是直接的,因为一旦没有对对象的强引用,弱值就会被垃圾回收。但是,您可以做的是使用ForwardingCache
由两个独立缓存(弱值缓存和定时到期缓存)支持的缓存,以便基于时间的缓存拥有对对象的强引用,从而将其保留在弱值缓存中。它看起来像这样:
public class WeakValuedExpiringCache<K, V> extends ForwardingCache<K, V> {
private final Cache<K, V> expiringCache;
private final Cache<K, V> weakCache;
public WeakValuedExpiringCache(CacheBuilder expiringSpec) {
expiringCache = expiringSpec.build();
weakCache = CacheBuilder.newBuilder().weakValues().build();
}
// weakCache is the canonical cache since it will hold values longer than
// expiration if there remain other strong references
protected Cache<K, V> delagate() {
return weakCache;
}
@override
public V get(K key, Callable<? extends V> valueLoader)
throws ExecutionException {
// repopulate the expiring cache if needed, and update the weak cache
V value = expiringCache.get(key, valueLoader);
weakCache.put(key, value); // don't call super.put() here
}
@Override
public void put(K key, V value) {
expiringCache.put(key, value);
super.put(key, value);
}
// Handle putAll(), cleanUp(), invalidate(), and invalidateAll() similarly
}
你也可以用 a 做同样的事情ForwardingLoadingCache
,就像.get()
上面一样,你应该从相关的加载方法中将值expiringCache
和.put()
它weakCache
加载到相关的加载方法中。