quel est le meilleur modèle ou de la méthode de la charge statique de cache?

Disons que j'ai les suivantes (à supposer limitée à java 1.4 donc pas de génériques) :

public class CacheManager {
    static HashMap states;
    static boolean statesLoaded;

    public static String getState(String abbrev) {
        if(!statesLoaded) {
            loadStates();
        }
        return (String) states.get(abbrev);
    }

    private static void loadStates() {
        //JDBC stuff to load the data
        statesLoaded = true;
    }
}

Dans une haute résistance multi-thread de l'environnement comme une application web serveur, ce qui pourrait théoriquement avoir des problèmes si > 1 thread tente d'obtenir et de charger le cache en même temps. (Plus loin en supposant que il n'y a pas de code de démarrage sur la web app pour initialiser le cache)

Est tout simplement à l'aide de Collections.synchronizedMap suffisante pour résoudre ce problème? Le retourné synchronizedMap ont des problèmes de performances lorsque vous faites get(), si beaucoup de threads accèdent?

Ou serait-il mieux d'avoir un non-synchronisé table de hachage, et, au lieu de se synchroniser sur la méthode de chargement ou variable booléenne? Je pense que si vous avez synchronisé à l'un de ces, vous pourriez finir vers le haut de verrouillage de la classe.

Par exemple, si la méthode de chargement, a été synchronisé, si 2 fils entrez le getStates() en même temps, et de voir que statesLoaded est faux. Le premier obtient un verrou sur la méthode, charge le cache et jeux de statesLoaded de vrai. Malheureusement, le 2ème fil a déjà évalué que statesLoaded était faux, et procède à la méthode de chargement, une fois que le verrou est libre. N'est-ce pas aller de l'avant et de charger le cache de nouveau?

OriginalL'auteur user26270 | 2009-07-17