Comment puis-je m'assurer qu'une méthode est appelée une seule fois par plusieurs threads?

Je avoir la structure suivante:

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

La méthode someMethod peut être appelé simultanément par plusieurs threads. Le doSomeProcessing peut lever une exception (c'est l'utilisation de certaines données dans le backend qui pourraient devenir obsolètes).
Si une exception est levée puis loadSomeHeavyData(); fait un peu tâche qui prend beaucoup de temps, disons "mises à jour" toutes les données actuelles et je suis en mesure d'appeler doSomeProcessing();.
Problème: Comment puis-je m'assurer que loadSomeHeavyData(); est appelé seulement une fois? Si j'ai mis quelques atomique drapeau à l'entrée de loadSomeHeavyData(); alors je ne peux pas être sûr si cela devrait être effacé.
Comment puis-je résoudre ce problème? Juste une remarque: je ne peux pas modifier doSomeProcessing(); que c'est une API externe et je suis en utilisant le décorateur modèle à utiliser.

source d'informationauteur Jim