[Java] une erreur d'operation concurrente... je seche.

une erreur d'operation concurrente... je seche. [Java] - Java - Programmation

Marsh Posté le 07-05-2004 à 15:15:47    

Bonjour a tous,
Je seche sur une "ConcurrentModificationException". Elle est généré par un iterateur que j'utilise pour modifier les clées d'un TreeMap (enfin je pense). En effet, mon but est de mettre un joue les clées d'une TreeMap deja crée. donc, je sort les objets et je les remets avec une nouvelle clé :
 
Voici des explications complémentaires :
 

Code :
  1. //Creating semaphores to open the serialized map :
  2. Map MyMap = rizo.getPers();
  3. Set entrySet = MyMap.entrySet();
  4. synchronized(MyMap)
  5.     { 
  6. for(Iterator i = entrySet.iterator();i.hasNext();)
  7.     {
  8.  Map.Entry entry = (Map.Entry) i.next();
  9.  Pers personne = (Pers) MyMap.remove(entry.getKey());
  10.  //checking for init :
  11.  if(!personne.isInitialized())
  12.      throw new RizoException("personne non initialise\n" );
  13.  //put the new couple :
  14.  String name=(String) personne.getName();
  15.  MyMap.put(name, personne);
  16. }
  17. }


 
sachant que :  
rizo.getPers() correspond a :

Code :
  1. public Map getPers()
  2. {
  3.    return Collections.synchronizedMap(new TreeMap(Persoriz));
  4. }


 
Je coince bien et je suis incapable de trouver la solution la. J'ai parcourut la recherche, idem.
Donc merci a celui qui peut m'aider :-)
encore mieux si quelqu'un connait une méthode pour modifier toutes les clés d'un map...
merci!
 
edit : j'ajouterais, que ca me jete apres un premier tour, arrivé au 2eme iterator... pouf badaboum. La doc de java dis pourtant que les opérations remove() et add() ne sont pas concernées par le jet de ConcurrentModificationException apres decryptage...


Message édité par Giansolo le 07-05-2004 à 15:35:27

---------------
grmmblblblbl...
Reply

Marsh Posté le 07-05-2004 à 15:15:47   

Reply

Marsh Posté le 07-05-2004 à 15:54:22    

1- J'ai du mal à saisir l'utilité de ce que tu fais.
2- C'est jamais bon de modifier ce que tu parcours avec un itérateur, List ou Map ou autre(même si c'est permis).


Message édité par pascal34 le 07-05-2004 à 15:55:58
Reply

Marsh Posté le 07-05-2004 à 16:02:44    

argh.
et bien en fait, je dois modifier la map apres une premiere initialisation, et je dois modifier toutes les clées de la map car je n'ai pas pu les recuperer avant.  
-je suppose donc qu'il faut créer une nouvelle map et ajouter les nouveaux couples modifiés?  
j'ai essayé cette approche, mais rien a faire, ca me ressort la meme erreur....

Reply

Marsh Posté le 07-05-2004 à 16:05:29    

remplace Map par un Vector...

Reply

Marsh Posté le 07-05-2004 à 16:07:03    

volontier, mais j'implemente une interface qui me specifie clairement de retourner une Map. avec rizo.getPers();  
un vrai bordel :-/

Reply

Marsh Posté le 07-05-2004 à 16:15:06    

Faut pas supprimer du premier Map, les objets que tu insère dans le deuxième.
Simplement, quand tu as fini, tu mets à null, la référence su premier Map pour libérer la mémoire qu'il occupait

Reply

Marsh Posté le 07-05-2004 à 16:15:36    

le Vector permet un accès multi-thread qui empêche les erreurs de type ConcurrentModificationException...
dc après tu fais comme tu veux !!!
t'as même un truc qui fait vector.addAll(taMap.values())
et hop c gagné...

Reply

Marsh Posté le 07-05-2004 à 16:16:55    

ok j'essaye ca illico-presto....
j'y avais pas pensé...
merci beaucoup


---------------
grmmblblblbl...
Reply

Marsh Posté le 07-05-2004 à 16:18:45    

titione a écrit :

le Vector permet un accès multi-thread qui empêche les erreurs de type ConcurrentModificationException...
dc après tu fais comme tu veux !!!
t'as même un truc qui fait vector.addAll(taMap.values())
et hop c gagné...


 
ouais c chouette, mais j'ai pas écrit l'interface que j'implemente, sinon tu penses bien....... j'aurais pris du vector hector


---------------
grmmblblblbl...
Reply

Marsh Posté le 07-05-2004 à 16:22:07    

Giansolo a écrit :

ouais c chouette, mais j'ai pas écrit l'interface que j'implemente, sinon tu penses bien....... j'aurais pris du vector hector


 
 :heink:

Reply

Marsh Posté le 07-05-2004 à 16:22:07   

Reply

Marsh Posté le 07-05-2004 à 18:20:32    

bon, déjà le ConcurrentModificationException n'a rien à voir avec un problème de synchronisation.
 
Ensuite, le gars qui conseille d'utiliser Vector à la place de la Map [:kiki]. D'une ca a rien à voir avec le problème : c'est pas un problème de synchro. De deux une Map et un vector ca a pas grand chose à voir. De trois, dans le cas où le besoin était d'avoir une map ou une list synchronizés, depuis le jdk1.2 y a les méthodes Collections.synchronizedXXX(). Il serait temps de perdre les mauvaises habitudes datant du jdk 1.1 !  
 
Le problème vient du fait que, en cours de l'itération, tu modifies la stucture de ta collection ce qui est interdit. La seule exception a cette règle est si tu passes par l'itérateur pour modifier cette collection. cf Iterator.remove(). (dans le cas précis du entrySet tu as également le droit d'appele certaines fnoction du set, cf la javadoc de Map.entrySet()).
 
Dans ton cas, de toute façon, ton code est bizare : il passe son temps à remettre dans la map des truc qu'il vient de retirer. Ca sert à rien.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-05-2004 à 23:54:08    

benou a écrit :

bon, déjà le ConcurrentModificationException n'a rien à voir avec un problème de synchronisation.
 
Ensuite, le gars qui conseille d'utiliser Vector à la place de la Map [:kiki]. D'une ca a rien à voir avec le problème : c'est pas un problème de synchro. De deux une Map et un vector ca a pas grand chose à voir. De trois, dans le cas où le besoin était d'avoir une map ou une list synchronizés, depuis le jdk1.2 y a les méthodes Collections.synchronizedXXX(). Il serait temps de perdre les mauvaises habitudes datant du jdk 1.1 !  
 
Le problème vient du fait que, en cours de l'itération, tu modifies la stucture de ta collection ce qui est interdit. La seule exception a cette règle est si tu passes par l'itérateur pour modifier cette collection. cf Iterator.remove(). (dans le cas précis du entrySet tu as également le droit d'appele certaines fnoction du set, cf la javadoc de Map.entrySet()).
 
Dans ton cas, de toute façon, ton code est bizare : il passe son temps à remettre dans la map des truc qu'il vient de retirer. Ca sert à rien.


 
tien pendant qu'on est ds le sujet.
y' a un soft sur lequel je bosse et parfois jme mange des ConcurrentModificationException  
a ce niveau:
 

Code :
  1. public BuddyList( String name )
  2. {
  3.  this.name = name;
  4.  this.list = Collections.synchronizedList( new ArrayList() );
  5.  this.map = Collections.synchronizedMap( new HashMap() );
  6. }
  7. ....
  8. public synchronized void sort( Comparator comp )
  9. {
  10.      Collections.sort( list, comp );//<< ici
  11. }


 
une idée?

Reply

Marsh Posté le 08-05-2004 à 11:06:39    


Tu est peut être en cour d'itération sur cette list ailleur, nan ?

Reply

Sujets relatifs:

Leave a Replay

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