Stellen Sie sich das folgende Szenario vor: Sie haben eine Singleton-Klasse, die eine Art Datenanbieter darstellt. Diese Singleton-Klasse weist eine Menge Speicher zu und Sie möchten, dass sie ihren zugewiesenen Speicher freigibt, wenn niemand ihn benutzt. Fluss:
Wie empfehlen Sie, Singleton zu implementieren, das in Stufe 3 (Klasse A und B "stirbt") den Speicher freigibt (ich weiß, dass Java Garbage Collection verwendet, aber immer noch den folgenden Speicher = null).
PS Ich möchte nicht jede Klasse erzwingen, die die Singleton-Aufruffreigabe bei Singleton verwendet, wenn sie nicht mehr verwendet wird. Ich möchte, dass der Singleton die "Freigabe" von Speicher selbst übernimmt.
Was Sie tun können, ist
WeakReference
. Dies wird nur nach einem GC am Leben bleiben, wenn es an anderer Stelle noch eine "starke" Referenz hat. Wenn die WeakReference.get()
null
ist, bedeutet dies, dass sie gesammelt wurde, weil niemand sie stark verwendet hat, eine andere schwache Referenz zählt nicht. Wenn es erneut benötigt wird, müssen Sie es neu erstellen und das WeakReference
.
So,
%Vor%BTW Dies setzt die Instanzen voraus, bei denen diese Instanz einen Verweis darauf behalten muss. Dies ist, wie die schwache Referenz "weiß", dass es noch benötigt wird.
BTW2 Sie müssen nicht synchronisiert werden, wenn es single threaded ist, aber es sollte harmlos sein.
Dies bedeutet, dass Sie diese Methode nur aufrufen sollten, wenn eine neue Instanz sie zum ersten Mal benötigt, nicht jedes Mal, und sie leistungsfähiger zu machen, sollte z. Doppelprüfung macht es nur komplizierter.
Die Verwendung von Design pattern: "Singleton"
ist sehr verbreitet und die allgemeine Implementierung verwendet static
reference
.
Das Problem mit dieser Implementierung besteht darin, dass floating garbage
oft nicht verwendet wird.
Zum Beispiel:
A singleton
, die eine DB connection pool
enthält, die nur von der Anwendung beim Start zum Einladen benötigt wird.
Daher ist eine bessere Lösung eine Erweiterung des Singleton-Entwurfsmusters namens WeakSingleton
.
Dieses Muster erwartet, wenn alle anderen Verweise auf die ursprüngliche Instanz abgelaufen sind, wird die Instanz bereinigt.
Eine Implementierung dieses Musters in Java ist sehr einfach und kann auf WeakReferences
basieren.
z. Code:
%Vor%Tags und Links java garbage-collection singleton memory-management