Jak mogę się upewnić, że metoda jest wywoływana tylko raz przez wiele wątków?
Mam następującą strukturę:
public void someMethod(){
//DO SOME STUFF
try{
doSomeProcessing();
}
catch (Exception e){
loadSomeHeavyData();
doSomeProcessing();
}
}
MetodasomeMethod
może być wywoływane jednocześnie przez wiele wątków. ThedoSomeProcessing
może rzuć wyjątek (używa niektórych danych z zaplecza, które mogą stać się przestarzałe).
Jeśli zostanie zgłoszony wyjątekloadSomeHeavyData();
wykonuje pewne zadanie czasowe, powiedzmy „zaktualizuj” wszystkie bieżące dane i mogę zadzwonićdoSomeProcessing();
.
Problem: Jak mogę się tego upewnićloadSomeHeavyData();
nazywa się tylkopewnego razu? Jeśli umieściłem jakąś flagę atomową we wpisieloadSomeHeavyData();
wtedy nie mogę być pewien, kiedy to powinno zostać usunięte.
Jak mogę to rozwiązać? Tylko uwaga: nie mogę modyfikowaćdoSomeProcessing();
ponieważ jest to zewnętrzny interfejs API i używam go z dekoratorem.