Probleme de concurrence d'acces inexpliquable .... - Java - Programmation
Marsh Posté le 19-12-2002 à 23:05:45
est ce que la récupérartion de iterateur et la boucle d'itération sont dans un blco synchronized sur la liste également ?
si non, c'est normal qu'il arrive que tu te prennes cette exception
Marsh Posté le 20-12-2002 à 00:45:40
ouais, tout est dans le bloc synchronized, j'y comprends rien !
- le thread qui boucle fait un sleep et tout le reste de la boucle est dans le bloc synchronized
- le thread qui gere les connections entrantes ne fait qu'un try/catch, et tout le corps du try est dans le bloc synchronized.
-Personne d'autre n'utilise cette liste ... :??/
Marsh Posté le 20-12-2002 à 01:29:56
Gonzoide a écrit : J'ai un serveur qui possede les threads suivants: |
T'as pris les wrappers "synchronised" sur ta liste ?
t'as pas fait de conneries avec l'itérateur ?
t'as pas fait de conneries avec la liste directement alors que tu avais un itérateur dessus ?
Marsh Posté le 20-12-2002 à 12:31:02
nraynaud a écrit : |
y a pas besoin si il faut la synchronization à la main en principe ...
Marsh Posté le 20-12-2002 à 14:05:40
Question : est-ce que tu modifies le contenu de la liste sur laquelle tu itères quand tu itères? Parce que si la réponse est "oui", le problème vient de là. Il ne faut pas changer le contenu de la liste sous-jacente à un itérateur lorsque l'on itère dessus.
L'exemple suivant le montre :
Code :
|
Il me retourne une java.util.ConcurrentModificationException
Marsh Posté le 20-12-2002 à 14:08:12
C'est d'ailleurs à cela que sert la méthode Iterator.remove().
Marsh Posté le 29-01-2007 à 16:04:16
Bonjour,
Je reviens sur ce pb un peu 5 ans après mais bon
Est ce que qq'un peut me dire comment faire pour supprimer un élément de l'itération (Sachanque je veux détruire l'objet en question et pas seulement le retirer de l'itération) ?
Marsh Posté le 29-01-2007 à 16:38:45
Oui je l'ai lu ... effectivemment c'est écris noir sur blanc, je n'avais pas fait gaffe la première fois ..
Mais alors quelle est la méthode pour modifier un élément lors d'une itération ?
Marsh Posté le 29-01-2007 à 17:24:14
Oui enfin là je ne parle pas de destructeur, je parle de modifier un élément d'une itération, alors qu'on parcours cette itération ... Est-ce possible ? Si oui comment ?
Marsh Posté le 29-01-2007 à 19:38:42
Ce n'est pas possible, Iterator.remove est la seule opération destructrice "safe" lors d'une itération sur une collection, et uniquement s'il est appelé au plus une fois par appel à Iterator.next (il lance une exception dans le cas contraire, de toute façon)
Tu peux trouver quelques autres fonctionalités dans java.util.Collection, mais je doute que ça t'aide beaucoup.
Marsh Posté le 19-12-2002 à 21:49:46
J'ai un serveur qui possede les threads suivants:
- un thread a chaque connexion acceptee, qui ajoute l'ip dans une liste puis qui meurt
- un thread qui boucle : il dort, puis regarde dans la liste d'ip celles qui sont trop vieilles et les supprime
dans chacun des deux cas, je fais un bloc "synchronized (la_liste) { ... }" pour rajouter ou enlever des elements dans cette liste. Pourtant, il arrive que dans un des threads, lorsque je fais un Iterator.next() sur ma liste, la JVM me pete une java.util.ConcurrentModificationException ... comment que c'est-il que c'est possible alors