【发布时间】:2018-06-28 08:55:09
【问题描述】:
我在一个类中有以下两种方法:
private MyDef myDef;
private FutureTask<MyDef> defFutureTask;
public synchronized void periodEviction() {
myDef = null;
}
public MyDef loadMyItems() {
// if it's not ready use a future - it will block until the results are ready
if (this.myDef == null) { // this will still not be thread safe
Callable<MyDef> callableDef = ()->{ return this.loadFromDatabase(); };
FutureTask<MyDef> defTask = new FutureTask<>(callableDef);
this.defFutureTask = defTask;
defFutureTask.run();
}
try {
// wait until's it's ready
this.myDef = this.qDefFuture.get();
} catch(InterruptedException e) {
log.error(this.getClass(), "Interrupted whilst getting future..");
} catch(ExecutionException e) {
log.error(this.getClass(), "Error when executing callable future");
}
return this.myDef;
}
我想做以下事情:
1) 每隔一小时左右使用periodEviction() 执行一次缓存驱逐。
2) 否则,在 db 加载完成时使用缓存的值。
我相信我误解了 Java 的未来,因为我无法回答“当线程 A、B 和 C 同时调用 loadMyItems() 时会发生什么?”
那么这是否意味着没有执行器之类的东西,这个实现仍然不是线程安全的?
【问题讨论】:
-
会发生三个线程将启动异步查询,每个线程都会返回其结果,最后一个设置值的线程将在下一小时的缓存中。为了使其线程安全,请将
loadMyItems也设为synchronized。
标签: java futuretask