Préface
Cet article essaie d'explorer de faibles références en Java du point de vue de quoi, pourquoi et comment aider tout le monde à comprendre les définitions, les scénarios d'utilisation de base et les méthodes d'utilisation des références faibles en Java.
1. Quoi - Quelle est une citation faible?
Les références faibles dans Java se réfèrent spécifiquement à java.lang.ref.WeakReference<T> . Voyons d'abord la documentation officielle l'explique:
L'existence d'un objet de référence faible n'empêche pas l'objet qu'il pointe d'être recyclé par le collecteur des ordures. L'utilisation la plus courante des références faibles consiste à mettre en œuvre des mappages canonicalisants (tels que les tables de hachage).
En supposant que le collecteur des ordures décide qu'un objet est faiblement accessible à un certain moment (c'est-à-dire que tous les points actuels sont des références faibles), le collecteur des ordures effacera toutes les références faibles à l'objet, puis marquera l'objet réactif faible comme finalisable, de sorte qu'il sera recyclé plus tard. Dans le même temps ou plus tard, le collecteur des ordures placera les références faibles nouvellement effacées dans la file d'attente de référence spécifiée lors de la création de l'objet de référence faible.
En fait, il existe quatre types de références en Java, qui sont de forts à faibles: référence forte , référence douce , référence faible et référence virtuelle .
Ci-dessous, nous introduisons brièvement trois autres citations en plus des citations faibles:
1. Référence forte: Habituellement, la référence que nous retournons lorsque nous créons un nouvel objet via New est une référence forte. Si un objet peut être atteint par une série de références fortes, elle est fortement accessible, alors elle ne sera pas recyclée.
2. Référence douce: La différence entre la référence douce et la faible référence est que si un objet est accessible par une référence faible, il sera recyclé, que la mémoire actuelle soit suffisante, tandis que l'objet accessible par une référence douce ne sera recyclé que lorsque la mémoire est insuffisante. Par conséquent, les références douces sont "plus fortes" que les références faibles.
3. Référence fantôme: la référence virtuelle est la référence la plus faible en Java, alors à quel point est-elle faible? Il est si fragile que nous ne pouvons même pas obtenir l'objet référencé via des références virtuelles. Le seul but des références virtuels est que lorsque l'objet il pointe est recyclé, la référence virtuelle elle-même sera ajoutée à la file d'attente de référence et utilisée pour enregistrer que l'objet auquel il pointe a été recyclé.
2. Pourquoi-pourquoi utilise-t-il des références faibles?
Considérez le scénario suivant: Il existe maintenant une classe Product qui représente un produit, qui est conçu pour être non échelonable, et à ce moment, nous voulons ajouter un nombre à chaque produit. Une solution consiste à utiliser HashMap<Product, Integer> . Donc, le problème vient. Si nous n'avons plus besoin d'un objet Product pour exister en mémoire (par exemple, ce produit a été vendu), en supposant que la référence est productA , nous attribuerons une valeur à productA en tant que null . Cependant, pour le moment, l'objet Product pointé par productA dans le passé ne sera pas recyclé, car il est évidemment référencé par HashMap . Donc, dans ce cas, si nous voulons vraiment recycler un objet Product , il ne suffit pas d'attribuer sa forte référence à null , et nous devons également supprimer l'entrée correspondante HashMap . De toute évidence, nous ne voulons pas terminer le travail de "supprimer par nous-mêmes les entrées de HashMap ". Nous voulons dire au collecteur des ordures: seule key HashMap fait référence Product , l'objet Product correspondant peut être recyclé. De toute évidence, sur la base de la définition précédente des citations faibles, l'utilisation de citations faibles peut nous aider à atteindre cet objectif. Nous avons juste besoin d'utiliser un objet de référence faible pointant vers Product comme key HashMap .
3. Comment, comment utiliser des références faibles?
Prenez le scénario introduit ci-dessus comme exemple. Nous utilisons un objet de référence faible pointant vers Product comme key de HashMap , et définissons simplement cet objet de référence faible comme ceci:
Product producta = nouveau produit (...); faible référence <produit> faibleProducta = new faibleSeference <> (producta);
Maintenant, si l'objet weakProductA est référencé, il pointe vers Product productA . Alors, comment pouvons-nous obtenir Product productA qu'il pointe via weakProduct ?
C'est très simple, il suffit de avoir besoin du code suivant:
Produit produit = faibleProducta.get ();
En fait, dans ce cas, la bibliothèque de classe Java nous fournit la classe WeakHashMap . En utilisant cette classe, sa clé est naturellement un objet de référence faible, et nous n'avons plus besoin d'envelopper manuellement l'objet d'origine. De cette manière, lorsque productA devient null (il indique que Product qu'il fait référence n'a plus besoin d'exister en mémoire), Product objet de référence faible est weakProductA , alors évidemment, l'objet Product correspondant est faible et peut être atteint à l'heure actuelle, de sorte que la référence faible pointant vers lui sera effacée, et l'objet Product sera recyclé, et la faible référence pointant vers lui sera effacée de la requête.
4. Fitre de référence
Présentez brièvement le concept de citer les files d'attente. En fait, la classe WeakReference a deux constructeurs:
// Créez une référence faible à la faible référence de l'objet donné (référence t) // Créez une référence faible à l'objet donné et enregistre une référence faible à la référence de référence donnée (référence t, référence <? Super T> Q)
Nous pouvons voir que le deuxième constructeur fournit un paramètre de type ReferenceQueue . En fournissant ce paramètre, nous enregistrons l'objet de référence faible créé sur une file d'attente de référence. De cette façon, lorsqu'il est effacé par le collecteur des ordures, il sera envoyé à la file d'attente de référence, et nous pouvons gérer ces objets de référence faibles nettoyés de manière unifiée.
5. Résumé
Eh bien, le contenu de cet article se termine ici. En raison du niveau personnel limité, il existe des aspects inévitablement inexacts ou peu clairs dans le récit. J'espère que vous pourrez le signaler, merci pour votre soutien à Wulin.com.