Java 缓存过期的未来实现

Java 缓存过期的未来实现,java,multithreading,concurrency,Java,Multithreading,Concurrency,我试图扩展Brian Goetz在《实践中的并发》(Concurrency in Practice)一书中给出的缓存实现 我想扩展缓存,如果任何条目在10秒内没有被访问,那么它应该过期。i、 e从缓存中删除 为此,我将未来任务扩展如下 package examples.cache; import java.util.concurrent.Future; public interface FutureWithExpire<V> extends Future<V> {

我试图扩展Brian Goetz在《实践中的并发》(Concurrency in Practice)一书中给出的缓存实现

我想扩展缓存,如果任何条目在10秒内没有被访问,那么它应该过期。i、 e从缓存中删除

为此,我将未来任务扩展如下

package examples.cache;

import java.util.concurrent.Future;

public interface FutureWithExpire<V> extends Future<V> {
    public boolean isResultExpired();
}
package examples.cache;
导入java.util.concurrent.Future;
公共接口FutureWithExpire扩展未来{
公共布尔值isResultExpired();
}

package examples.cache;
导入java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.FutureTask;
公共类FutureTaskWithExpire扩展FutureTask实现FutureWithExpire{
专用最终静态长有效期=10*1000;
私人长到期时间;
公共未来任务到期(可调用){
超级(可调用);
}
@凌驾
public V get()抛出InterruptedException,ExecutionException{
V=super.get();
expirationTime=System.currentTimeMillis()+有效期;
返回v;
}
公共布尔值isResultExpired(){
if(isDone()){
if(expirationTime
如上所示,我正在重写get方法来计算过期时间

在主缓存类中,即我将启动一个新线程,该线程将定期扫描条目并删除
isResultExpired
返回true的条目

我只是想知道这个实现是否可行,或者我的代码中是否存在一些bug

注意,我也应该覆盖。但是,为了保持简洁,我省略了这一点。

为什么这段代码是:

 expirationTime = System.currentTimeMillis() + validPeriod;
在get方法中?在我看来,它应该在构造函数中,否则它会很快失效。假设您创建了FutureTaskWithExpire实例和其他一些线程,假定使条目无效的线程调用isResultExpired方法,过期时间实际上为零,因此条目将无效,即使它仍然有生存时间


另外,我认为get和isExpired的调用应该在ReentrantLock上同步,例如,因为您不希望某个线程使您的条目无效,在另一个线程中,您试图给出该条目。

当然,expirationTime应该是易变的

而不是使用
isResultExpired
您可以只返回
null
,否则您可能会有一个竞赛条件,其中isExpiredResult为false,但在您获得它时,它已经过期。如果您想让某些生产代码过期,而不仅仅是一个练习,您可以使用
WeakHashMap
类来评估是否依赖JVM使缓存项过期。这就是为什么我使用isDone()-因此,只有当任务完成时,该方法才会返回true,但同意应该同步这两个方法。
 expirationTime = System.currentTimeMillis() + validPeriod;