IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[vector] erreur étrange


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut [thread] exclusion mutuelle section critique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private synchronized void drawTrajectories(){
    	for(int i=0;i<trajectories.size();i++){
    		try{
    			trajectories.get(i).draw(gbuf,startTime,currentTime);
    		} catch (ArrayIndexOutOfBoundsException e){
    			// sometimes I got this exception I don't know why
    		}
    	}
    }
    voila, j'ai donc cette méthode qui lance une exception ArrayIndexOutOfBoundsException de temps en temps (pas tout le temps).

    Pourtant en théorie :
    - i<trajectories.size()
    - elle est synchronized

    donc si vous avez des idées, ça serait pas mal, parce que je bon j'aime pas resté sur ma faim et passé à autre chose sans comprendre

  2. #2
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Salut,

    je vois pas de probleme, remplace la boulce for par un Iterator pour voir. et modifie le catch:
    catch(Exception e){
    e.printStackTrace();
    }

    Si une modification est fait au vector l'Iterator lancera une exception.

  3. #3
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    bah en fait mon code roule, c'est bon, j'ai mis le try catcht pour ça, mais je comprend pas pourquoi il y a une exception, elle ne devrait pas exister à mon avis !!

    mais je vais tester avec l'iterator pour voir ce que ça dit.

    mais en théorie, le fait que ma méthode soit synchronized ne devrait pas éviter que le vecteur soit modifié ???

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Sp4ce Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pourtant en théorie :
        -  i<trajectories.size()
        - elle est synchronized
    Et les autres méthodes qui accèdent à ton vecteur sont aussi synchronisés SUR LE MÊME OBJET?

    PS: ArrayList, c'est mieux que Vector

  5. #5
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Citation Envoyé par ®om Voir le message
    Et les autres méthodes qui accèdent à ton vecteur sont aussi synchronisés SUR LE MÊME OBJET?
    ça sous-entend que si une méthode non synchronisée (sans le mot clé synchronized donc) fait une modif sur mon objet, cette modif sera appliqué tout de suite ?

    tu dis "synchronisé sur un objet", mais je ne sais que mettre le mot clé synchronized quand je déclare une méthode, je veux dire que je synchronise la méthode, pas l'objet... enfin ya peut être un truc qui m'a échappé o_O

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    http://rom.developpez.com/java-synchronisation/

    section II. Exclusion mutuelle de sections critiques

  7. #7
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    salut, la principal fonction qui y accède c'est celle-ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    synchronized(this) {
    	trajectories = new Vector<Trajectory>();
    	if(localTrajectories!=null)
    		trajectories.addAll(localTrajectories);
    	trajectories.addAll(app.getTrajHandler().getTrajectories());
    }
    qui se trouve dans le run() d'un thread.

    donc si je voudrais synchroniser sur le même objet, il faudrait que je fasse comment ? parce que apparemment mes deux sections critiques le sont pas. (Je croyais que mettre le mot synchronized suffisait mais en fait non).

  8. #8
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Citation Envoyé par Sp4ce Voir le message
    tu dis "synchronisé sur un objet", mais je ne sais que mettre le mot clé synchronized quand je déclare une méthode, je veux dire que je synchronise la méthode, pas l'objet... enfin ya peut être un truc qui m'a échappé o_O

    Le mot synchronized permet d'obtenir un verrou sur un objet.
    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    class MonProg extends JFrame{
     
    	Vector<Object> vec = new Vector<Object>;
    	// contruteur
    	public MonProg(){
     
    		// création d'un thread
    		Thread T1 = new Thread(){
    			public void run(){
    				remplirVector(); // Méthode synchro T1 obtient un verrou sur l'objet MonProg
    			}
     
    		};
     
    		T1.start();
     
    	drawTrajectories(); // MonProg tente d'obtenir le un verrou
    						// on doit attentre que T1 libere le verrou pour continuer.
    						// le programme se bloque ici tant que T1 possède le verrou.
     
    }
     
    	public synchronized void remplirVector(){
    		//... remplire le vector
    	}
    	public synchronized void drawTrajectories(){
    		//... utiliser le vector 
    	}
    }
    D'ailleurs, utilise ArrayList au lieu de Vector.

  9. #9
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    alors je vais expliquer un tout petit mieux parce que mon problème est pas aussi simple ^^

    alors voila le run de mon thread qui modifie le vecteur (dsl, je vais garder Vector, ça me va très bien, a moins que ça ait un lien avec le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public void run(){
    	while(true){
    		(...)
    		if(!localOnly){
    			synchronized(this) {
    				trajectories = new Vector<Trajectory>();
    				if(localTrajectories!=null)
    					trajectories.addAll(localTrajectories);
    					trajectories.addAll(app.getTrajHandler().getTrajectories());
    			}
    		} else {
    			trajectories = localTrajectories;
    		}
    		repaint()
    	}
    }
    à coté de ça dans une autre classe interne qui s'occupe de dessiner, j'ai mon paint(Graphics g) qui invoque drawTrajectories() qui lance l'exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Override
    public void paint(Graphics g){
    	(...)
     
    	if(trajectories!=null)
    		drawTrajectories();
     
    	(...)
    }
    donc dans mon run, la partie qui modifie le vecteur Trajectories est bien verrouillé vu que j'ai mis synchronized et drawTrajectories aussi vu que je j'ai aussi mis synchronized (cf. plus haut)

  10. #10
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Il me manque quelques informations sur la structure de ton code pour cibler le problème.


    Code :
    @Override
    public void paint(Graphics g){
    (...)

    if(trajectories!=null)
    drawTrajectories();

    (...)
    }
    donc dans mon run, la partie qui modifie le vecteur Trajectories est bien verrouillé vu que j'ai mis synchronized et drawTrajectories aussi vu que je j'ai aussi mis synchronized (cf. plus haut)
    Dans cette partie, il y a un bloc synchronized ou non ? si non, faudrait en mettre un. Encore la, ca dépend de la structure du code.

    Pour le Vector, il s'agit d'une collection qui date du 1.1. et ces méthodes sont syncronized, ce qui fait ralentir.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Message d'erreur étrange sur mon serveur
    Par irnatene dans le forum Mandriva / Mageia
    Réponses: 3
    Dernier message: 28/11/2006, 14h20
  2. Message d'erreur étrange
    Par maitreblitosaure dans le forum Access
    Réponses: 10
    Dernier message: 29/06/2006, 11h45
  3. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00
  4. [vector] erreur incomprehnsible
    Par shirya dans le forum SL & STL
    Réponses: 13
    Dernier message: 09/12/2005, 12h31
  5. Erreur étrange sur recvfrom
    Par Gore dans le forum Développement
    Réponses: 2
    Dernier message: 17/02/2005, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo