Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
656 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Probleme de concurrence d'acces inexpliquable ....

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de concurrence d'acces inexpliquable ....

n°273396
Gonzoide
Les cochons... dans l'espâââce
Posté le 19-12-2002 à 21:49:46  profilanswer
 

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

mood
Publicité
Posté le 19-12-2002 à 21:49:46  profilanswer
 

n°273430
benou
Posté le 19-12-2002 à 23:05:45  profilanswer
 

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

n°273479
Gonzoide
Les cochons... dans l'espâââce
Posté le 20-12-2002 à 00:45:40  profilanswer
 

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

n°273488
nraynaud
lol
Posté le 20-12-2002 à 01:29:56  profilanswer
 

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 ?

n°273674
benou
Posté le 20-12-2002 à 12:31:02  profilanswer
 

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 ...

n°273727
duchzeworl​d
Posté le 20-12-2002 à 14:05:40  profilanswer
 

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

n°273732
BifaceMcLe​OD
The HighGlandeur
Posté le 20-12-2002 à 14:08:12  profilanswer
 

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

n°1508291
protoinou
Posté le 29-01-2007 à 16:04:16  profilanswer
 

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

n°1508300
the real m​oins moins
Posté le 29-01-2007 à 16:20:01  profilanswer
 

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

n°1508309
protoinou
Posté le 29-01-2007 à 16:38:45  profilanswer
 

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 ?  

mood
Publicité
Posté le 29-01-2007 à 16:38:45  profilanswer
 

n°1508320
phnatomass
Je m'empare de ton esprit !!
Posté le 29-01-2007 à 16:52:46  profilanswer
 

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

n°1508331
protoinou
Posté le 29-01-2007 à 17:24:14  profilanswer
 

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

n°1508384
masklinn
í dag viðrar vel til loftárása
Posté le 29-01-2007 à 19:38:42  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Probleme de concurrence d'acces inexpliquable ....

 

Sujets relatifs
[delphi] débutant : Accès aux fichiersacces 2000, VBA et temps d'éxécution
problème avec 'showInputDialog'problème de comparaison de date (mysql).
Probleme avec des matrices de transformation 3D ...probleme de <SELECT> et présélection d'une value [RESOLU]
probléme en JMF et vidéofonction qui pose probleme
[PHP] accès qu système de fichier et vérouillage de fichiers (flock)[Applet JAVA] Problème de thread qui ne rend pas la main
Plus de sujets relatifs à : Probleme de concurrence d'acces inexpliquable ....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR