不是直接的,因爲弱者值可以被垃圾收集只要沒有更強烈的對象引用。然而,你可以做的是使用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
}
你可以做同樣的事情用ForwardingLoadingCache
爲好,就像上面.get()
你應該從expiringCache
和.put()
它的價值裝入weakCache
在相關的裝載方法。
謝謝!那很完美。你看到我的問題,我的意思是應該沒有其他引用的價值BESIDES緩存。我沒有想過,一個弱引用不會阻止gc。 – jacob