Schwache Referenzen in Java

Schwache Referenzen in Java

1. Überblick

In diesem Artikel werfen wir einen Blick auf das Konzept einer schwachen Referenz - in der Java-Sprache.

Wir werden erklären, was dies ist, wofür sie verwendet werden und wie man richtig mit ihnen arbeitet.

2. Schwache Referenzen

Ein schwach referenziertes Objekt wird vom Garbage Collector gelöscht, wenn es schwach erreichbar ist.

Schwache Erreichbarkeit bedeutet, dass einobject has neither strong nor soft references pointing to it. Das Objekt kann nur durch Überfahren einer schwachen Referenz erreicht werden.

Zunächst löscht der Garbage Collector einen schwachen Verweis, sodass auf den Verweis nicht mehr zugegriffen werden kann. Dann wird die Referenz in eine Referenzwarteschlange (falls eine zugeordnete vorhanden ist) gestellt, von der wir sie erhalten können.

Gleichzeitig werden ehemals schwer erreichbare Objekte finalisiert.

3. Anwendungsfälle

Wie in der Java-Dokumentation angegeben,weak references are most often used to implement canonicalizing mappings. Eine Zuordnung wird als kanonisiert bezeichnet, wenn sie nur eine Instanz eines bestimmten Werts enthält. Anstatt ein neues Objekt zu erstellen, wird das vorhandene Objekt im Mapping gesucht und verwendet.

Natürlich sind diemost known use of these references is the WeakHashMap class. Dies ist die Implementierung derMap-Schnittstelle, bei der jeder Schlüssel als schwache Referenz auf den angegebenen Schlüssel gespeichert wird. Wenn der Garbage Collector einen Schlüssel entfernt, wird auch die diesem Schlüssel zugeordnete Entität gelöscht.

Weitere Informationen finden Sie unterour guide to WeakHashMap.

Ein weiterer Bereich, in dem sie verwendet werden können, istthe Lapsed Listener problem.

Ein Verleger (oder ein Betreff) enthält starke Verweise auf alle Abonnenten (oder Listener), um sie über Ereignisse zu informieren, die stattgefunden haben. The problem arises when a listener can’t successfully unsubscribe from a publisher.

Daher kann ein Listener nicht durch Müll gesammelt werden, da ein starker Verweis darauf noch für einen Publisher verfügbar ist. Infolgedessen können Speicherverluste auftreten.

Die Lösung des Problems kann ein Thema sein, das einen schwachen Bezug zu einem Beobachter hat, der es dem ersteren ermöglicht, Müll zu sammeln, ohne sich abmelden zu müssen (beachten Sie, dass dies keine vollständige Lösung ist und einige andere Probleme einführt, die dies nicht sind hier behandelt).

4. Arbeiten mit schwachen Referenzen

Schwache Referenzen werden durch die Klassejava.lang.ref.WeakReferencedargestellt. Wir können es initialisieren, indem wir einen Referenten als Parameter übergeben. Optional können wirjava.lang.ref.ReferenceQueue angeben:

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

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


Der Referent einer Referenz kann mit der Methodeget abgerufen und mit der Methodeclearmanuell entfernt werden:

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

Das Muster für das sichere Arbeiten mit dieser Art von Referenzen ist das gleiche wie beisoft references:

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

5. Fazit

In diesem kurzen Lernprogramm haben wir uns mit dem Konzept einer schwachen Referenz in Java auf niedriger Ebene befasst und uns auf die gängigsten Szenarien konzentriert, um diese zu verwenden.