Selbstfreigabe (Referenzzählung) singelton

8

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:

  1. Klasse A ruft getInstance auf und verwendet Singleton (dies ist das erste Mal, dass getInstance aufgerufen wird und die Singleton-Klasse einen großen Speicherblock zuweist)
  2. Klasse B ruft getInstance auf und verwendet Singleton
  3. Klasse A und Klasse B "stirbt" (niemand benutzt jetzt Singleton)
  4. Das Programm läuft noch, aber der Speicher des Singletons ist nicht freigegeben.

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.

    
JobNick 19.12.2013, 08:28
quelle

2 Antworten

6

Was Sie tun können, ist

  • erstellt das Singleton erst, wenn es zum ersten Mal angefordert wird.
  • speichere es in 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.

    
Peter Lawrey 19.12.2013 08:32
quelle
1

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%     
Prashant Shilimkar 19.12.2013 08:37
quelle