Как я могу убедиться, что метод вызывается только один раз несколькими потоками?
У меня есть следующая структура:
public void someMethod(){
//DO SOME STUFF
try{
doSomeProcessing();
}
catch (Exception e){
loadSomeHeavyData();
doSomeProcessing();
}
}
МетодsomeMethod
может быть вызванным одновременно многими потоками.doSomeProcessing
может генерировать исключение (оно использует некоторые данные в бэкэнде, которые могут устареть).
Если выдается исключение, тоloadSomeHeavyData();
выполняет некоторое трудоемкое задание, которое позволяетс "обновления» все текущие данные и я могу позвонить.doSomeProcessing();
Проблема: Как я могу убедиться, чтоloadSomeHeavyData();
называется толькоодин раз? Если я поставлю какой-то атомный флаг в записиloadSomeHeavyData();
тогда я не могу быть уверен, когда это должно быть очищено.
Как я могу решить это? Просто примечание: я не могу изменитьdoSomeProcessing();
так как это внешний API, и я использую шаблон декоратора, чтобы использовать его.