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 :

Probleme avec Hashtable


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut Probleme avec Hashtable
    Mon probleme:

    ma méthode containsKey de Hashtable me retourne true. (ce qui me permet de conclure que la clé existe bien dans ma table)
    quand j'appel la méthode get elle me retourne une value null !!!! comme si elle n'a pas retrouvée ma clé avec la méthode get.
    C'est peut être un problème avec mon hashCode.
    Voila mes sources:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(!hashtable.containsKey(key)){
    		    			Value value = new Value(1);
    		    			hashtable.put(key,value);
    			    }else{
    				    	Value value = hashtable.get(key);
    				    	//ici value == null !!!!!!!!!!!!!!
    				    	hashtable.put(key,value);
    			    }
    Voila ma class Key
    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
    32
    33
    34
    35
    36
    37
     
    public class Key{
     
        	String className; 
        	String methodNameDesc;
        	int section;
     
    	public Key(String className, String methodNameDesc, int section) {
    		this.className = className;
    		this.methodNameDesc = methodNameDesc;
    		this.section = section;
    	}
     
    	public boolean equals(Object o){
    		if(o == null){
    			return false;
    		}
    		Key k = (Key)o;
    		if(k.getClassName().equals(this.className)
    			&& k.getMethodNameDesc().equals(this.methodNameDesc)
    			&& k.getSection()==this.section){
    			return true;		
    		}
    		return false;	
    	}
     
    	public int hashCode(){
    		int result=0;
    		for(int i=0;i<className.length();i++){
    			result += Integer.valueOf(className.charAt(i));
    		}
    		for(int i=0;i<methodNameDesc.length();i++){
    			result += Integer.valueOf(methodNameDesc.charAt(i));
    		}
    		result += section;
    		return result;
    	}

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la seule raison pour laquelle containsKey retournerais true mais que le get renverrais null, avec ton code, serait qu'un autre thread, entre les deux opérations, supprime l'entrée.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut ok merci
    c'est tout a fait possible que ce soit cela.

    Comment puis-je faire pour remédier a cela?

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ne pas modifier ta table depuis plusieurs thread en même temps, ou alors gérer correctement les accès concurent avec des bloc synchronized aux bons endroits.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut ok j'ai remarqué quelque chose
    j'ai ajouté le code :

    Collections.synchronizedMap(hashtable);
    ->cela ne change rien.

    j'ai déclaré la méthode dans laquelle je fais les opérations synchronized.
    -> j'ai toujours le même problème.

    en rajoutant un bloc synchronized(this) autour de chaque put et chaque get.
    -> même problème

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par GroRelou Voir le message
    j'ai ajouté le code :

    Collections.synchronizedMap(hashtable);
    ->cela ne change rien.
    Ca évitera les "bug" interne à datatable. C'est à faire absolument mais non suffisant


    j'ai déclaré la méthode dans laquelle je fais les opérations synchronized.
    -> j'ai toujours le même problème.
    Toutes les méthodes dans lesquelles tu manipule en lecture ou écriture ta datatable doivent être synchronized sur le même verrou.

    en rajoutant un bloc synchronized(this) autour de chaque put et chaque get.
    -> même problème
    Ca ne sert à rien puisque le problème surviens entre les appels.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Par défaut c'est pas les threads
    Preuve que c'est pas les threads
    voila mon code:

    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
     
    static int compteur2 = 0;
     
    void mamethod(){
     
       if(!hashtable.containsKey(key)){
    		Value value = new Value(1);
    		System.out.println("avant put "+compteur2);
    		hashtable.put(key,value);	
    		System.out.println("apres put, avant get bidon "+compteur2);
    		Value value2 = null;
    		value2 = hashtable.get(key);
    		System.out.println("apres get bidon "+compteur2);
       }else{
    		System.out.println(compteur2);
    		Value value = null;
    		System.out.println("avant get"+compteur2);
    	        value = hashtable.get(key);
    		System.out.println("apres get"+compteur2);
    		value.addNbTimes();
    		hashtable.put(key,value);
       }			    
     compteur2++;
    }
    je fais compteur2++ à la fin de ma méthode et tous les compteur2 affichées dans ma console se suivent donc pas de thread qui viennent perturber le bon fonctionnement.

    Non mon problème est plutot du à mon hashCode je pense ?
    non?

  8. #8
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Par défaut
    Citation Envoyé par GroRelou Voir le message
    Collections.synchronizedMap(hashtable);
    ->cela ne change rien.
    On pouvait en fait s'en douter. Une Hashtable correspond en gros à une HashMap synchronisée

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

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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