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

Concurrence et multi-thread Java Discussion :

HashMap en multi-thread et NullPointerException ; comment est-ce possible ?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut HashMap en multi-thread et NullPointerException ; comment est-ce possible ?
    Bonjour,

    J'ai une méthode rechercherAssiette() appelée par plusieurs threads,

    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
    classe Gpc { 
     
    private Map<String, Map<String, Map<Boolean, ResultatUnitaireNonType>>> listeAssietteCumule; 
    ... 
     
    public Runt rechercherAssiette(final String codeProcess, final String codeAssiette, final boolean isPrescrit) { 
     
      if (listeAssietteCumule.get(codeProcess) == null) { 
        listeAssietteCumule.put(codeProcess, new HashMap<String, Map<Boolean, 
    Runt>>()); 
      } 
      if (listeAssietteCumule.get(codeProcess).get(codeAssiette) == null) { 
        listeAssietteCumule.get(codeProcess).put(codeAssiette, new HashMap<Boolean, ResultatUnitaireNonType>()); 
      } 
      return listeAssietteCumule.get(codeProcess).get(codeAssiette).get(isPrescrit); 
      } 
     
    ... 
    }
    Celle-ci renvoie une exception NullPointerException à la dernière ligne.

    Le même code en monothread fonctionne bien par contre.

    Bref, je ne comprends pas ce qui se passe.

    Merci

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 606
    Points : 15 645
    Points
    15 645
    Par défaut
    Tout d'abord quand tu poste du code met le entre les balise [CODE ] et[/CODE ] pour qu'il soit lisible.

    Ensuite les classes de Collection ne sont pas "Thread safe", ce qui signifie qu'elle ne sont pas concues de manière à ce que leur fonctionnement en mutithread soit garanti.

    Si tu veux les utiliser en multithread il faut les synchroniser. Pour faire cela tu peux utiliser Collection.synchronizedMap() du package java.util:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Key,Value> mapSynchro = Collection.synchronizedMap(new Map<Key,Value>)

  3. #3
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Ou tu as aussi des ConcurrentHashMap ...

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour les réponses, c'est ce que j'avais trouvé ça et là sur le net mais je ne comprends toujours pas pourquoi celà génère un NullPointerException.

  5. #5
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 606
    Points : 15 645
    Points
    15 645
    Par défaut
    Il faudrait regarder l'implementation de la Map pour comprendre vraiment ce qui ce passe. Je n'en ai pas vraiment le courage.

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    pour voir vraiment d'où ça vient il faudrait savoir ce qui est null :

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeAssietteCumule.get(codeProcess)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeAssietteCumule.get(codeProcess).get(codeAssiette)
    ça pourrait déjà être un bon point de départ ...

Discussions similaires

  1. Réponses: 16
    Dernier message: 16/10/2012, 17h04
  2. Erreur intermitente ! Comment est-ce possible ?
    Par shenzhu dans le forum Général Java
    Réponses: 6
    Dernier message: 17/05/2010, 20h18
  3. Negociation, comment est ce possible?
    Par Jim_Nastiq dans le forum Paie
    Réponses: 11
    Dernier message: 31/07/2007, 16h03
  4. Comment est-ce possible ?
    Par Jibees dans le forum C
    Réponses: 25
    Dernier message: 05/09/2006, 11h08

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