Wie kann ich sicherstellen, dass eine Methode von mehreren Threads nur einmal aufgerufen wird?

Ich habe folgende Struktur:

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

Die MethodesomeMethod kann von vielen Threads gleichzeitig aufgerufen werden. DasdoSomeProcessing kann eine Ausnahme auslösen (es werden einige Daten im Backend verwendet, die veraltet sein könnten).
Wenn eine Ausnahme ausgelöst wird, dannloadSomeHeavyData(); erledigt einige zeitaufwendige Aufgaben, bei denen wir alle aktuellen Daten "aktualisieren" und anrufen könnendoSomeProcessing();.
Problem: Wie kann ich das sicherstellen?loadSomeHeavyData(); heißt nurEinmal? Wenn ich eine Atomflagge in den Eintrag von steckeloadSomeHeavyData(); dann kann ich nicht sicher sein, wann dies geklärt werden soll.
Wie kann ich das lösen? Nur eine Anmerkung: Ich kann nicht änderndoSomeProcessing(); da es sich um eine externe API handelt und ich das Dekorationsmuster verwende, um es zu verwenden.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage