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

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°718757
Giansolo
ben ... rien....
Posté le 07-05-2004 à 15:15:47  profilanswer
 

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...
mood
Publicité
Posté le 07-05-2004 à 15:15:47  profilanswer
 

n°718821
pascal34
one point !
Posté le 07-05-2004 à 15:54:22  profilanswer
 

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
n°718846
Giansolo
ben ... rien....
Posté le 07-05-2004 à 16:02:44  profilanswer
 

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

n°718856
titione
addicted
Posté le 07-05-2004 à 16:05:29  profilanswer
 

remplace Map par un Vector...

n°718863
Giansolo
ben ... rien....
Posté le 07-05-2004 à 16:07:03  profilanswer
 

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

n°718908
pascal34
one point !
Posté le 07-05-2004 à 16:15:06  profilanswer
 

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

n°718911
titione
addicted
Posté le 07-05-2004 à 16:15:36  profilanswer
 

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

n°718918
Giansolo
ben ... rien....
Posté le 07-05-2004 à 16:16:55  profilanswer
 

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


---------------
grmmblblblbl...
n°718927
Giansolo
ben ... rien....
Posté le 07-05-2004 à 16:18:45  profilanswer
 

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...
n°718935
pascal34
one point !
Posté le 07-05-2004 à 16:22:07  profilanswer
 

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:

mood
Publicité
Posté le 07-05-2004 à 16:22:07  profilanswer
 

n°719081
benou
Posté le 07-05-2004 à 18:20:32  profilanswer
 

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
n°719266
veryfree
Posté le 07-05-2004 à 23:54:08  profilanswer
 

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?

n°719349
benou
Posté le 08-05-2004 à 11:06:39  profilanswer
 


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


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

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

 

Sujets relatifs
[JAVA] Nombre limite de thread[java] un problème d'accesseurs....
changement d'un background sur un onmouseover => erreur[java] JTable : y a t'il un moyen de donner un nom aux lignes
[JAVA] pb de SocketException avec readObject()[java] Choisir un nombre aleatoirement dans un intervalle
[Java] Look des objets graphiques[JAVA] Erreur d'un applet dans une page sécurisé
[java] File a capacite limitee circulaire en tableau[résolu][Java] Singleton VerifyError
Plus de sujets relatifs à : [Java] une erreur d'operation concurrente... je seche.


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