@Override public synchronized V put(K k, V v) { reap(); return super.put(k, v); }
/** * Mark a key as being reapable, caching corresponding soft reference to corresponding value in the secondary map. */ public synchronized void reapable(K k) { V v = super.remove(k); if (v != null) { reapableMap.put(k, new IdAwareReference<>(k, v, queue)); } reap(); }
@Override public synchronized V get(Object key) { V ret = super.get(key); if (ret == null) { IdAwareReference<K, V> ref = accessBasedAging ? reapableMap.remove(key) : reapableMap.get(key); if (ref != null) { if (ref.isEnqueued()) { ref.clear(); reapableMap.remove(key); } else { ret = ref.get(); if (ret == null) { reapableMap.remove(key); } else if (accessBasedAging) { // re-insert on timestamp reset so // as to maintain insertion order reapableMap.put(ref.key, ref.reset()); } } } } reap(); return ret; }
@Override public synchronized V remove(Object key) { V ret = super.remove(key); if (ret == null) { IdAwareReference<K, V> ref = reapableMap.remove(key); if (ref != null) { if (ref.isEnqueued()) { ref.clear(); } else { ret = ref.get(); } } } reap(); return ret; }