Как я могу убедиться, что метод вызывается только один раз несколькими потоками?

У меня есть следующая структура:

public void someMethod(){  
   //DO SOME STUFF
   try{  
    doSomeProcessing();  
   }  
   catch (Exception e){  
        loadSomeHeavyData();  
        doSomeProcessing();      
   }    
}  

МетодsomeMethod может быть вызванным одновременно многими потоками.doSomeProcessing может генерировать исключение (оно использует некоторые данные в бэкэнде, которые могут устареть).

Если выдается исключение, тоloadSomeHeavyData(); выполняет некоторое трудоемкое задание, которое позволяетс "обновления» все текущие данные и я могу позвонить.doSomeProcessing();

Проблема: Как я могу убедиться, чтоloadSomeHeavyData(); называется толькоодин раз? Если я поставлю какой-то атомный флаг в записиloadSomeHeavyData(); тогда я не могу быть уверен, когда это должно быть очищено.

Как я могу решить это? Просто примечание: я не могу изменитьdoSomeProcessing(); так как это внешний API, и я использую шаблон декоратора, чтобы использовать его.

Ответы на вопрос(5)

Ваш ответ на вопрос