Références faibles en Java

Références faibles en Java

1. Vue d'ensemble

Dans cet article, nous allons examiner le concept de référence faible - en langage Java.

Nous allons vous expliquer de quoi il s'agit, à quoi ils servent et comment travailler correctement avec eux.

2. Références faibles

Un objet faiblement référencé est effacé par le garbage collector lorsqu'il est faiblement accessible.

Une accessibilité faible signifie qu'unobject has neither strong nor soft references pointing to it. L'objet ne peut être atteint qu'en parcourant une référence faible.

Tout d'abord, le ramasse-miettes efface une référence faible, le référent n'est donc plus accessible. Ensuite, la référence est placée dans une file d'attente de références (s'il en existe un associé) d'où nous pouvons l'obtenir.

Dans le même temps, les objets anciennement difficilement accessibles vont être finalisés.

3. Cas d'utilisation

Comme indiqué par la documentation Java,weak references are most often used to implement canonicalizing mappings. Un mappage est appelé canonicalisé s'il ne contient qu'une instance d'une valeur particulière. Plutôt que de créer un nouvel objet, il recherche l'objet existant dans le mappage et l'utilise.

Bien sûr, lesmost known use of these references is the WeakHashMap class. C’est l’implémentation de l’interfaceMap où chaque clé est stockée en tant que référence faible à la clé donnée. Lorsque le ramasse-miettes supprime une clé, l'entité associée à cette clé est également supprimée.

Pour plus d'informations, consultezour guide to WeakHashMap.

Un autre domaine où ils peuvent être utilisés estthe Lapsed Listener problem.

Un éditeur (ou un sujet) détient de fortes références à tous les abonnés (ou auditeurs) pour les informer des événements survenus. The problem arises when a listener can’t successfully unsubscribe from a publisher.

Par conséquent, un auditeur ne peut pas être récupéré car une référence forte à ce dernier est toujours disponible pour un éditeur. Par conséquent, des fuites de mémoire peuvent se produire.

La solution au problème peut être un sujet contenant une référence faible à un observateur permettant au premier d'être ramassé sans avoir besoin d'être désabonné (notez que ce n'est pas une solution complète, et cela introduit d'autres problèmes qui ne le sont pas). couvert ici).

4. Travailler avec des références faibles

Les références faibles sont représentées par la classejava.lang.ref.WeakReference. On peut l'initialiser en passant un référent en paramètre. En option, nous pouvons fournir unjava.lang.ref.ReferenceQueue:

Object referent = new Object();
ReferenceQueue referenceQueue = new ReferenceQueue<>();

WeakReference weakReference1 = new WeakReference<>(referent);
WeakReference weakReference2 = new WeakReference<>(referent, referenceQueue);


Le référent d'une référence peut être récupéré par la méthodeget, et supprimé manuellement en utilisant la méthodeclear:

Object referent2 = weakReference1.get();
weakReference1.clear();

Le modèle pour travailler en toute sécurité avec ce type de références est le même qu'avecsoft references:

Object referent3 = weakReference2.get();
if (referent3 != null) {
    // GC hasn't removed the instance yet
} else {
    // GC has cleared the instance
}

5. Conclusion

Dans ce rapide tutoriel, nous avons examiné le concept de bas niveau d'une référence faible en Java - et nous sommes concentrés sur les scénarios les plus courants pour les utiliser.