Mon jet de code Suivre une exception: je veux un mais je n'ai trouvé que Toute place pour obtenir Merci d'aide :) p> p> Concurrentlinkedhasset code> pour le corriger, p>
concurrentskiplistset code> dans
java.util.concurrent code>, il s'agit code> arbreset code>, pas
linkedhashset code> p>
ConcurrentLinkedHashSet code> dans jdk6.0? P>
4 Réponses :
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 ... p>
Vous pouvez toujours créer une collection synchronisée avec de la DOCS pour SynchronizedMap: P>
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. P>
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. p>
blockQuote>
c'est parce que p>
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. P> LI>
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? p> li>
ul> collections.synchronizedMap (myMap); code>. 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. p>
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. p>
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 p>
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 ...
Il y a ConcurrentLinkedhashMap - https://code.google.com/p/concurrentLinkedHashmap/ p>
Vous pouvez créer défini sur celui-ci avec Java.Util.Collections.Newsetfrommap (carte) P>
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 code> 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) code> sur
définir RS = nouveau linkedaShashset (); pour (itérateur ir = liste.itéator (); ir.snext ();) {Rs.add (ir.Suivant ()); } code> 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.