Java 缓存过期的未来实现
我试图扩展Brian Goetz在《实践中的并发》(Concurrency in Practice)一书中给出的缓存实现 我想扩展缓存,如果任何条目在10秒内没有被访问,那么它应该过期。i、 e从缓存中删除 为此,我将未来任务扩展如下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> {
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;