Probleme de concurrence d'acces inexpliquable ....

Probleme de concurrence d'acces inexpliquable .... - Java - Programmation

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 :??: :??: :??:

Reply

Marsh Posté le 19-12-2002 à 21:49:46   

Reply

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

Reply

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 ... :??: :??: :??/

Reply

Marsh Posté le 20-12-2002 à 01:29:56    

Gonzoide a écrit :

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 :??: :??: :??:  


 
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 ?

Reply

Marsh Posté le 20-12-2002 à 12:31:02    

nraynaud a écrit :


T'as pris les wrappers "synchronised" sur ta liste ?


y a pas besoin si il faut la synchronization à la main en principe ...

Reply

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 :
  1. import java.util.Iterator;
  2. import java.util.ArrayList;
  3. public class Test
  4. {
  5.   public static void main(String[] args)
  6.   { ArrayList l = new ArrayList();
  7.     l.add("a" );
  8.     l.add("b" );
  9.     l.add("c" );
  10.     Iterator i =l.iterator();
  11.     while (i.hasNext())
  12.     { Object o = i.next();
  13.       System.out.println(o);
  14.       l.remove(o);                   
  15.     }     
  16.   }
  17. }


 
Il me retourne une java.util.ConcurrentModificationException

Reply

Marsh Posté le 20-12-2002 à 14:08:12    

C'est d'ailleurs à cela que sert la méthode Iterator.remove(). ;)

Reply

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) ?

Reply

Marsh Posté le 29-01-2007 à 16:20:01    

t'as lu la javadoc de Iterator.remove() ?

Reply

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 ?  

Reply

Marsh Posté le 29-01-2007 à 16:38:45   

Reply

Marsh Posté le 29-01-2007 à 16:52:46    

Il n y a pas de "destructeur" en java.

Reply

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 ?  
:)

Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed