ないが、弱い値がゴミを収集することができますので、オブジェクトへの強い参照がなくなると直ちに終了します。ただし、弱い値のキャッシュと時間切れのキャッシュの2つのキャッシュによってバックアップされたForwardingCache
を使用すると、時間ベースのキャッシュはオブジェクトへの強い参照を保持し、弱い値のキャッシュに保持されます。関連する積載方法にweakCache
にexpiringCache
と.put()
それから値をロードする必要がありますあなたはあなた以上.get()
のように、同様ForwardingLoadingCache
と同じことを行うことができます
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
}
:それはこのような何かを見てね。
ありがとう!それは最高です。そして、あなたは私の質問に、私はキャッシュにBESIDES値への他の参照がなければならないということを知っていました。弱い参照がgcを防ぐことは決してないと私は考えなかった。 – jacob