Vorwort
In diesem Artikel wird versucht, schwache Referenzen in Java aus den Perspektiven dessen zu untersuchen, warum und wie man jedem hilft, die Definitionen, die grundlegenden Nutzungsszenarien und die Nutzungsmethoden schwacher Referenzen in Java zu verstehen.
1. Was-was ist ein schwaches Zitat?
Schwache Referenzen in Java beziehen sich speziell auf java.lang.ref.WeakReference<T> . Schauen wir uns zunächst die offizielle Dokumentation an: erklärt sie:
Die Existenz eines schwachen Referenzobjekts verhindert nicht das Objekt, auf das es vom Müllsammler recycelt wird. Die häufigste Verwendung schwacher Referenzen besteht darin, kanonikalisierende Mappings (wie Hash -Tabellen) umzusetzen.
Unter der Annahme, dass der Müllsammler entscheidet, dass ein Objekt zu einem bestimmten Zeitpunkt schwach erreichbar ist (dh alle aktuellen Punkte darauf sind schwache Referenzen), wird der Müllsammler alle schwachen Verweise auf das Objekt löschen und dann das schwache erreichbare Objekt als endgültig markieren, sodass es später wieder aufgenommen wird. Gleichzeitig oder später stellt der Müllsammler die neu gelöschten schwachen Referenzen in die Referenzwarteschlange ein, die beim Erstellen des schwachen Referenzobjekts angegeben ist.
Tatsächlich gibt es in Java vier Arten von Referenzen, die von stark bis schwach sind: starke Referenz , weiche Referenz , schwache Referenz und virtuelle Referenz .
Im Folgenden führen wir neben schwachen Zitaten kurz drei weitere Zitate ein:
1. Starker Referenz: Normalerweise ist die Referenz, die wir zurückgeben, wenn wir ein neues Objekt durch NEW erstellen, eine starke Referenz. Wenn ein Objekt durch eine Reihe starker Referenzen erreicht werden kann, ist es stark erreichbar, dann wird es nicht recycelt.
2.. Daher sind weiche Referenzen "stärker" als schwache Referenzen.
3.. Phantomreferenz: Virtuelle Referenz ist die schwächste Referenz in Java. Wie schwach ist es also? Es ist so zerbrechlich, dass wir das referenzierte Objekt nicht einmal durch virtuelle Referenzen erhalten können. Der einzige Zweck virtueller Referenzen ist, dass die virtuelle Referenz selbst der Referenzwarteschlange hinzugefügt wird, wenn das Objekt, auf das es zeigt, recycelt wird, dass das Objekt, auf das sie verweist, recycelt wurde.
2. Warum-warum-warum schwache Referenzen verwenden?
Betrachten Sie das folgende Szenario: Es gibt jetzt eine Product , die ein Produkt darstellt, das nicht skalierbar ist. Zu diesem Zeitpunkt möchten wir jedem Produkt eine Zahl hinzufügen. Eine Lösung besteht darin HashMap<Product, Integer> zu verwenden. Das Problem kommt also. Wenn wir kein Product mehr im Speicher benötigen (zum Beispiel wurde dieses Produkt verkauft), unter der Annahme, dass der Verweis darauf productA ist, werden wir productA als null einen Wert zuweisen. Zu diesem Zeitpunkt wird das Product jedoch in der productA nicht recycelt, da es offensichtlich von HashMap verwiesen wird. Wenn wir also ein Product wirklich recyceln möchten, reicht es nicht aus, nur seinen starken Hinweis auf null zuzuweisen, und wir müssen auch den entsprechenden Eintrag aus HashMap entfernen. Offensichtlich wollen wir die Arbeiten, "keine Einträge mehr von HashMap zu entfernen" zu vervollständigen, nicht abschließen. Wir möchten den Müllsammler mitteilen: Nur key im HashMap -Bezug auf Product Produktobjekt kann das entsprechende Product recycelt werden. Basierend auf der vorherigen Definition schwacher Zitate kann es uns helfen, dieses Ziel zu erreichen. Wir müssen nur ein schwaches Referenzobjekt verwenden, das auf Product Produktobjekt als key in HashMap zeigt.
3. Ich habe-wie-wie schwache Referenzen verwenden?
Nehmen Sie das oben eingeführte Szenario als Beispiel. Wir verwenden ein schwaches Referenzobjekt, das auf Product Produktobjekt als key von HashMap zeigt, und definieren einfach dieses schwache Referenzobjekt wie folgt:
Produkt producta = neues Produkt (...); Wecreference <Product> Wecproducta = new Wecreference <> (producta);
Wenn nun das Objekt weakProductA verwiesen wird, zeigt es auf Product productA Wie erhalten wir also Product productA , auf das es durch weakProduct verweist?
Es ist sehr einfach, brauche nur den folgenden Code:
Produkt produkt = weawProducta.get ();
In der Tat bietet uns für diesen Fall die Java -Klassenbibliothek die WeakHashMap -Klasse. Mit dieser Klasse ist der Schlüssel natürlich ein schwaches Referenzobjekt, und wir müssen das ursprüngliche Objekt nicht mehr manuell einwickeln. Auf diese Weise wird productA null (es zeigt an, dass Product das es nicht mehr im Speicher gibt), Product schwache Referenzobjekt ist weakProductA . Offensichtlich ist das Product Product schwach und kann zu diesem Zeitpunkt erreicht werden, so
4. Referenzwarteschlange
Lassen Sie uns kurz das Konzept des Zitierens von Warteschlangen vorstellen. Tatsächlich hat die WeakReference -Klasse zwei Konstruktoren:
// Erstellen Sie eine schwache Referenz auf das angegebene Objekt WeaCreference (T Referenz) // Erstellen Sie eine schwache Referenz auf das angegebene Objekt und registriert eine schwache Referenz auf die angegebene Referenzwarteschlange (t Reference, Referenzqueue <? Super T> Q)
Wir können sehen, dass der zweite Konstruktor einen Parameter des Typs ReferenceQueue liefert. Durch die Bereitstellung dieses Parameters registrieren wir das erstellte schwache Referenzobjekt in einer Referenzwarteschlange. Auf diese Weise wird es, wenn es vom Müllsammler gelöscht wird, an die Referenzwarteschlange gesendet, und wir können diese gereinigten schwachen Referenzobjekte auf einheitliche Weise verwalten.
5. Zusammenfassung
Nun, der Inhalt dieses Artikels endet hier. Aufgrund der begrenzten persönlichen Ebene gibt es unvermeidlich ungenaue oder unklare Aspekte in der Erzählung. Ich hoffe, Sie können darauf hinweisen, vielen Dank für Ihre Unterstützung für Wulin.com.