Thread-safe de la mise en œuvre de Hachage Carte
D'abord, je vais décrire ce que je veux et puis je vais élaborer sur les possibilités que j'envisage. Je ne sais pas qui est le meilleur, donc je veux un peu d'aide.
J'ai un hachage carte sur laquelle je ne les opérations de lecture et écriture à partir d'un Servlet
. Maintenant, depuis cette Servlet
est sur Tomcat, j'ai besoin de la valeur de hachage de la carte pour être thread-safe. En gros, quand il est en cours d'écriture, rien d'autre à écrire pour elle et rien ne devrait être en mesure de le lire ainsi.
J'ai vu ConcurrentHashMap
, mais il a remarqué sa méthode get n'est pas thread-safe. Ensuite, j'ai vu des serrures et quelque chose appelé synchronisé.
Je veux savoir qui est le moyen le plus fiable de le faire.
- En quoi est ConcurrentHashMap.non thread-safe? Et quel est le niveau de granularité que vous recherchez? "Quand il est écrit" voulez-vous dire qu'il y aura plusieurs opérations put, ou est-il suffisant pour que chacun soit atomique?
- Voir la doc de l'API, j'ai pensé qu'il n'est pas thread-safe. Il peut y avoir plusieurs opérations put pour le hachage de la carte si dire 3 les gens décident de faire la même opération de placement.
- Le fait qu'il permet à des opérations simultanées ne fait-il pas thread-safe.
- Aussi, si quelque chose est écrit dans la table de hachage de la carte, quelqu'un d'autre ne devrait pas être capable de le lire. Ne ConcurrentHashMap la garantie que?
- Il ne garantit pas que, à partir de la javadoc: opérations d'Extraction (y compris les obtenir) ne sont généralement pas bloquer, donc peuvent se chevaucher avec les opérations de mise à jour (y compris les mettre et de l'enlever). Les récupérations de refléter les résultats de la dernière mise à jour des opérations de portefeuille au moment de leur apparition.
- Je ne peux pas imaginer ce que je pensais et pourquoi j'ai besoin de cette condition spécifique (pas de lit ou écrit au cours d'une écriture) lorsque j'ai demandé à ce. Aussi, pour un devoir en classe. N'utilisez pas de grain grossier serrures, les enfants!
Vous devez vous connecter pour publier un commentaire.
EDIT: suppression de fausses informations
Dans tous les cas, la
synchronized
mot-clé est une valeur sûre. Il bloque tous les threads d'accéder à l'objet, tandis qu'à l'intérieur d'unsynchronized
bloc.par opposition à
Servlet
dans un récipient. Tous les cartographié les demandes passent par la même instance. Si vous avez des champs d'instance, puis chaque demande, d'avoir accès à eux.service()
méthode de servlets pourrait obtenir exécutées simultanément (sauf si le Servlet est déclarée commeSingleThreadModel
) bien qu'il existe une seule instance de servlet. Par conséquent, l'instance de la variable déclarée dans une classe de Servlet peut être appelée à partir de la demande multiple threads de traitement.ConcurrentHashMap.get()
est thread-safe.Vous pouvez faire
HashMap
thread-safe en l'enveloppant avecCollections.synchronizedMap()
.synchronized
on ne le fait pas.Collections.synchronizedMap(new HashMap<K, V>);
Je voudrais vous suggérer d'aller avec
ConcurrentHashMap
, l'exigence que vous avez mentionné ci-dessus ,plus tôt, j'ai aussi eu le même type d'exigence pour notre application, mais nous étions peu plus axée sur le côté performance.J'ai couru les deux
ConcurrentHashMap
et la carte retournée parColecctions.synchronizedMap();
, en vertu de différents types de charges et le lancement de plusieurs threads à l'aide de JMeter et j'ai surveillé eux à l'aide de JProfiler .Après tous ces tests, nous en sommes venus à la conclusion que la carte retournée parColecctions.synchronizedMap()
n'était pas aussi efficace en termes de performances dans comaprison àConcurrentHashMap
.J'ai écrit un post aussi sur le même sujet de mon expérience avec les deux.
Grâce
C'est le point de ConcurrentHashMap classe. Il protège votre collection, si vous avez plus d'1 fil.