Implémentation d'une LinkedHashMap simultanée
Je suis en train de créer un concurrent à l'LinkedHashMap pour une architecture multithread.
Si j'utilise Collections#synchronizedMap()
je dois utiliser synchronisé blocs pour l'itération. Cette mise en œuvre conduirait à une addition successive d'éléments.
Si j'utilise ConcurrentSkipListMap
est-il possible de mettre en œuvre un Comparator
pour stocker de manière séquentielle, tel qu'il est stocké dans la Liste Liée ou une file d'attente.
Je voudrais utiliser java intégré à la place de packages tiers.
EDIT:
Dans ce simultanées LinkedHashMap
si les clés sont le nom, je tiens à mettre les clés dans l'ordre de leur arrivée. c'est à dire la nouvelle valeur sera annexé à ce soit au début ou à la fin, mais de façon séquentielle.
Lors de l'itération, la LinkedHashMap
pourrait être ajoutée avec de nouvelles entrées, ou supprimé. mais l'itération doit être l'ordre dans lequel les entrées ont été ajoutées.
Je comprends qu'en utilisant Collections#synchronizedMap()
un bloc synchronisé pour l'itération devrait être mis en œuvre, mais serait la carte modifiables (les entrées peuvent être ajoutés/supprimés) alors qu'il est itérée.
source d'informationauteur Nilesh
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez synchronizedMap, vous n'avez pas à synchroniser l'extérieur, sauf pour l'itération. Si vous avez besoin de préserver la commande de la carte, vous devez utiliser un SortedMap. Vous pouvez utiliser ConcurrentSkipListMap, qui est thread-safe, ou un autre SortedMap en combinaison avec synchronizedSortedMap.
Un
LinkedHashMap
a une liste doublement chaînée cours d'exécution à travers une table de hachage. Une FIFO seulement de mutation sur les liens en écriture (insertion ou suppression). Cela rend la mise en œuvre d'une version assez simple.#put()
/#putIfAbsent()
/#remove()
avec un cadenas.Sur itération, pas de lock est nécessaire que vous pouvez en toute sécurité suivre les "à côté". Lit peut être sans verrouillage par juste de déléguer à la CHM sur un
#get()
.Utilisation
Collections#synchronizedMap()
.Ce n'est pas vrai. Vous avez seulement besoin de synchroniser l'itération sur tous les points de vue (jeu de clés, valeurs, entryset). Voir aussi la abovelinked documentation de l'API.
Jusqu'à maintenant, mon projet a utilisé LRUMap de Apache Collections, mais il est basé sur SequencedHashMap. Collections propose ListOrderedMap mais aucun n'est thread-safe.
Je suis passé à Cartographe de Google Goyave. Vous pouvez regarder CacheBuilder trop.
De messagerie unifiée, réponse simple serait d'utiliser un monotone croissante fournisseur clé de votre
Comparator
fonctionne. PensezAtomicInteger
et chaque fois que vous insérez, vous créez une nouvelle clé pour être utilisé pour les comparaisons. Si vous mettez votre clé réel, vous pouvez faire une carte interne deOrderedKey<MyRealKeyType>
.Ce serait élimine le besoin pour une mesure de comparaison, et vous donner une belle O(1) méthode de calcul de la taille (sauf si vous le permettez supprime, dans lequel cas, le comte de ceux aussi bien, de sorte que vous pouvez juste soustraire "réussite supprime" à partir de "réussite", où la réussite signifie une entrée a été effectivement créés ou supprimés).