Mise en œuvre d'une cache à l'aide d'un java ConcurrentHashMap
J'aimerais mettre en œuvre une simple mise en cache de lourds objets dans une application java. Mais je ne peux pas comprendre comment le faire correctement.
Suis-je raté quelque chose ou ConcurrentHashMap méthodes (putIfAbsent, ...) ne sont pas suffisants et synchronisation supplémentaire est-elle nécessaire ?
Est-il un meilleur API simple (Dans la mémoire de stockage, sans config) pour ce faire ?
P.
Je me demandais: ce sont vraiment vos exigences pour la mise en cache? Avez-vous besoin pour mettre en cache la pleine fermeture transitive de votre poids lourd de l'objet de sorte qu'il est cohérent sur l'ensemble du cluster de serveurs d'application? Si oui, c'est un non-trivial problème à résoudre, et vous feriez mieux d'utiliser un cache de la bibliothèque comme ehcache.
OriginalL'auteur Paolo1976 | 2010-01-15
Vous devez vous connecter pour publier un commentaire.
S'il est sûr de temporairement avoir plus d'une instance pour la chose que vous essayez de cache, vous pouvez faire un "lock-free" cache comme ceci:
Plusieurs threads peuvent "race" pour créer et ajouter un élément pour la clé, mais un seul doit "gagner".
Ou simplement l'utiliser Cartographe, et un seul thread sera jamais créer les Lourds. Si un autre thread besoins pendant qu'il est encore dans le milieu de la création, il sera tout simplement d'attendre le résultat.
Je vais laisser le droit de vote
MapMaker
gourous de la réponse à cette question.OriginalL'auteur Ken
Plus à Ken de réponse, si la création d'un poids lourd de l'objet qui, plus tard, se jette pas n'est PAS acceptable, vous voulez vous assurer que seulement un objet est créé pour chaque clé, pour une raison quelconque), alors vous pouvez le faire en.... en fait, ne le faites pas. Ne pas le faire vous-même. Utiliser le google-collections (maintenant goyave) Cartographe de la classe:
Alors qu'un simple
cache.get(key)
juste œuvres et supprime complètement vous soucier de délicat aspects de la simultanéité et de syncrhonization.Notez que si vous voulez ajouter un peu amateur de fonctionnalités, comme la date d'expiration, c'est juste
et vous pouvez également utiliser facilement doux ou des valeurs faibles pour les clés ou les données si nécessaire (voir la Javadoc pour plus de détails)
OriginalL'auteur Cowan
Au lieu de mettre le "gros objets" dans le cache, vous pouvez utiliser la lumière de l'usine d'objets pour créer un cache actif.
OriginalL'auteur sfussenegger
ConcurrentHashMap devrait être suffisant pour vos besoins putIfAbsent est thread-safe.
Pas sûr de savoir comment beaucoup plus simple que vous pouvez obtenir
Paul
OriginalL'auteur Paul Whelan
Je me rends compte que c'est un vieux post, mais en java 8 cela peut se faire sans la création d'un potentiellement inutilisés objet lourd avec un ConcurrentHashMap.
OriginalL'auteur Shane