7
votes

Y a-t-il une liaison concurrente likedHashashset dans JDK6.0 ou d'autres bibliothèques?

Mon jet de code Suivre une exception: xxx

je veux un Concurrentlinkedhasset pour le corriger,

mais je n'ai trouvé que concurrentskiplistset dans java.util.concurrent , il s'agit arbreset , pas linkedhashset

Toute place pour obtenir ConcurrentLinkedHashSet dans jdk6.0?

Merci d'aide :)


5 commentaires

Essayez-vous d'ajouter ou de supprimer des éléments tout en boucle surdites LinkedHashashset? La solution peut ne pas utiliser un ensemble simultané, mais plutôt, à l'aide d'un itérateur pour effectuer des modifications à mi-boucle


J'ai reçu un concurrentLinkedhashset ici: Artemis.ms.mff.cuni.cz/viewvc/pogamut/trunk/project/cor E / SRC / CZ / ... :)


Je ne disais pas que vous ne pouvez pas obtenir de concurrentsLinkedhashashashsset, mais que votre problème peut provenir de modifier votre lingedhasquette dans une boucle, et si c'était le cas, l'utilisation d'un itérateur de la liaison LinkedHashashSet serait une solution beaucoup plus appropriée. Vous n'auriez pas besoin d'un ensemble de hachage lié simultané, sauf s'il y a une filetage impliquée dans votre programme.


@Zach l TRÈS Merci de l'aide, vous voulez dire que je vais changer définir RS = nouveau linkedHashSet (liste) sur définir RS = nouveau linkedaShashset (); pour (itérateur ir = liste.itéator (); ir.snext ();) {Rs.add (ir.Suivant ()); } non? Merci :)


Si vous postez un SSCCEE , c'est-à-dire un exemple court, autonome et compilable, de l'endroit où vous obtenez cette erreur, Nous pourrons vous offrir une meilleure aide. De votre petit exemple, il ne faut pas non plus lancer une exception concyurentModification, apparemment.


4 Réponses :


0
votes

Malheureusement pas. Vous pouvez implémenter votre propre, enveloppant une ConcurrenthashMap et un concurrentLinkedQueue, mais cela ne vous permettrait pas de supprimer facilement les valeurs (la suppression serait O (n), car vous deviez itérité à travers tout dans la file d'attente) ... < / p>

Qu'est-ce que vous utilisez le linkedhashset pour cependant? Pourrait être capable de suggérer des alternatives ...


0 commentaires

4
votes

Vous pouvez toujours créer une collection synchronisée avec collections.synchronizedMap (myMap); . Cependant, essayer de modifier la carte pendant que vous itération (ce que je suppose que la cause de votre erreur) sera toujours un problème.

de la DOCS pour SynchronizedMap:

Renvoie une carte synchronisée (thread-coffre-fort) sauvegardée par la carte spécifiée. Afin de garantir l'accès en série, il est essentiel que tous les accès à la carte de support soient accomplis par la carte retournée.

Il est impératif que l'utilisateur synchroniser manuellement sur le retour carte lors de l'itération sur l'un de ses Vues de la collection ... Défaut de suivre Ce conseil peut entraîner comportement non déterministe.

c'est parce que

  • Normalement, une collection simultanée garantissait vraiment atomique get / put mais ne bloque pas toute la collection lors de l'itération, ce qui serait trop lent. Il n'y a pas de garantie de concurrence sur l'itération, qui est en réalité de nombreuses opérations sur la carte.

  • Ce n'est pas vraiment une simultanence si vous modifiez pendant l'itération, car il est impossible de déterminer le comportement correct - par exemple, comment réconcilier votre itérateur renvoyant hasnext == true avec supprimer une (éventuellement la valeur suivante) de la collection?


0 commentaires

10
votes

Une exception concurrente n'a rien à voir avec la concurrence dans la forme que vous envisagez. Cela signifie simplement que tout en itérant sur la collection, quelqu'un (probablement votre propre code - qui se produit assez souvent;)) Change-le, c'est-à-dire ajouter / supprimer certaines valeurs.

Assurez-vous que vous utilisez l'itérateur pour supprimer les valeurs de la collection et non la collection elle-même.

EDIT: Si vraiment un autre thread accède à la collection en même temps, la faible synchronisation que vous recevez de la bibliothèque standard est inutile de toute façon, car vous devez bloquer la collection pendant toute la durée de la Opération non seulement pour un ajout / Supprimer! C'est à dire. quelque chose comme xxx


1 commentaires

Notez que cela modifie le contrat de la collecte et (selon les composants utilisant la collection et comment), il peut être difficile de le modifier (obtenir tous les clients à se conformer). Question rhétorique: Lorsque vous êtes itération d'une collection qui vous est fournie par un composant / cadre différent, pensez-vous que si la mise en œuvre est sûre pour l'itération simultanée et s'il peut y avoir des modifications en parallèle? Les chances sont des auteurs d'autres composants n'ont aucune idée de cela aussi ...



2
votes

Il y a ConcurrentLinkedhashMap - https://code.google.com/p/concurrentLinkedHashmap/

Vous pouvez créer défini sur celui-ci avec Java.Util.Collections.Newsetfrommap (carte)


0 commentaires