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

Contribuez Java Discussion :

[Réaction] Références et Gestion de la mémoire


Sujet :

Contribuez Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [Réaction] Références et Gestion de la mémoire
    Bonjour, je ne sais pas si c'est vraiment la bonne section pour poster cela.
    Quoiqu'il en soit je n'ai pas trouvé de quelconque lien pour contacter directement l'auteur de ce tutoriel, ni de fonctionnalité sur le site pour réagire à un tutoriel.

    Je voulais simplement réagire sur une partie du tutoriel :

    En parlant des weak references
    Puisque les objets ainsi référencés peuvent être libérés à tout moment par le garbage collector, nous devons vérifier qu'ils n'ont pas disparus avant de nous en servir. Cela force également le programmeur à obtenir une hard reference vers l'objet pour empêcher le garbage collector de le supprimer alors que nous désirons nous en servir.
    D'accord, avant d'utiliser la référence, il faut la passer en hard histoire de pas se faire avoir par le gc.
    Sauf que si on travail avec les threads, et que lors de l'exécution de fireBeerPouredEvent() un autre thread décide de supprimer la référence à notre listener juste entre le test d'existance de la référence et son utilisation (et que la destruction se fait bien réellement juste à ce moment la) , on se fait avoir.

    J'aurais plutôt pensé qu'il faille d'abord prendre la hard reference de notre listener et d'ensuite tester son existance.
    Je ne connais pas trop les weak references, alors je ne sais pas trop ce qui se passe si on essaye de faire un "this.listener.get()" lorsque this.listener == null.
    Je déduis du reste du code donné en exemple dans le tutoriel que si cela arrive on aurat une NullPointerException, alors autant l'utiliser !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BeerListener listener = null;
     
    try {
        listener = this.listener.get();
    } catch (NullPointerException ex) {
        // Plus de référence disponible
        return;
    }
     
    // Suite du traitement, on peut faire l'assertion que listener != null

    Voila, sinon je n'ai pas tilté sur autre chose.
    Merci à Romain pour ce tutoriel qui est, comme dit dans un autre sujet, court et instructif .

  2. #2
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Ton listener ne doit pas être un BeerListener, mais un WeakReference<BeerListener>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private WeakReference<BeerListener> listener = null;
    protected void fireXXX() {
        if(listener != null) {
            BeerListener bl = listener.get();
            if(bl != null)
                bl.xxx();
        }
    }
    Car dans ton exemple, tu n'utilise pas du tout de WeakReference, tu utilises simplement une référence vers un objet, qui bien sûr quand elle est null et que tu lui appliques une méthode, ça renvoie un NullPointerException.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    C'est en relation avec cette article :
    http://gfx.developpez.com/tutoriel/j...rence-memoire/
    2ème exemple de code

    où this.listener est une weak reference

  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
    Points : 3 080
    Points
    3 080
    Par défaut
    La seule chose que je vois fausse dans cet exemple, c'est que WeakReference n'est pas paramétrée par BeerListener, et que le .get() retourne donc un Object et non un BeerListener...

Discussions similaires

  1. Réponses: 13
    Dernier message: 14/02/2008, 13h27
  2. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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