我有以下结构:
public void someMethod(){
//DO SOME STUFF
try{
doSomeProcessing();
}
catch (Exception e){
loadSomeHeavyData();
doSomeProcessing();
}
}
方法someMethod
可以被多个线程同时调用,doSomeProcessing
可能会抛出异常(它正在使用一些后端数据,这些数据可能会变得过时)。
如果抛出异常,则loadSomeHeavyData();
执行一些耗时的任务,例如“更新”所有当前数据,并且我可以调用doSomeProcessing();
。
问题:如何确保loadSomeHeavyData();
只被调用一次?如果在loadSomeHeavyData();
入口处放置原子标志,则无法确定何时应清除该标志。
怎么解决?请注意:由于doSomeProcessing();
是外部API,我正在使用修饰器模式来使用它,因此无法修改它。
catch
中调用loadSomeHeavyData
的位置,改为将请求放入队列中调用。这是一种设计变更,但可以更好地满足您的需求。请查看我下面的答案。 - Azodious