通常,缓存应将对象保留大约一段时间,并应在一段时间后将其公开。什么是用以保持物体的好时机取决于使用情况。我希望这件事很简单,没有线程或调度程序。这种方法对我有用。与SoftReference
s 不同,对象可以保证在最短时间内可用。但是,在太阳变成红色巨人之前,不要呆在记忆中。
作为一个使用示例,考虑一个响应速度缓慢的系统,该系统应能够检查请求是否在最近才完成,即使忙碌的用户多次按下按钮,该请求也不会执行两次所请求的操作。但是,如果稍后再请求执行相同的操作,则应再次执行。
class Cache<T> {
long avg, count, created, max, min;
Map<T, Long> map = new HashMap<T, Long>();
/**
* @param min minimal time [ns] to hold an object
* @param max maximal time [ns] to hold an object
*/
Cache(long min, long max) {
created = System.nanoTime();
this.min = min;
this.max = max;
avg = (min + max) / 2;
}
boolean add(T e) {
boolean result = map.put(e, Long.valueOf(System.nanoTime())) != null;
onAccess();
return result;
}
boolean contains(Object o) {
boolean result = map.containsKey(o);
onAccess();
return result;
}
private void onAccess() {
count++;
long now = System.nanoTime();
for (Iterator<Entry<T, Long>> it = map.entrySet().iterator(); it.hasNext();) {
long t = it.next().getValue();
if (now > t + min && (now > t + max || now + (now - created) / count > t + avg)) {
it.remove();
}
}
}
}