Singleton mit WeakReference

DE   C#

Piccard: “…denn letztlich, Nummer Eins, sind wir alle nur sterblich!”

Riker: “Sprechen Sie nur für sich selbst, Sir. Ich habe vor, ewig zu leben.”

In einem vorherigen Artikel über “Weak References” habe ich eine Kombination aus Singleton und WeakReference angedeutet. Hier nun eine mögliche Implementierung.

Die Implementierung eines Singleton habe ich bereits in der Serie “Pattern of the Week 13” (alter Blog) erläutert. Die Erweiterung für ein “WeakSingleton” besteht im wesentlichen im Ersetzen der “Instance” Property auf die Klasse “WeakReference” und eine Anpassung des Codes, der eine Instanz anlegt und zurück gibt.

Interessant ist so ein Singleton beispielsweise bei einer Klasse mit Dateizugriff. Greifen mehr als ein Thread gleichzeitig auf eine Datei schreibend zu, kommt es zu Zugriffskonflikten. Ein Singleton löst dieses Problem, da alle Threads auf die gleiche geöffnete Datei zugreifen.

Bis jetzt spricht alles für ein Singleton, aber was passiert, wenn man die Datei nur dann geöffnet haben möchte, wenn die Datei von mindestens einem Thread verwendet wird? Hier ist ein “Weak Singleton” wie oben die Lösung. Der folgende Test zeigt, das eine neue Instanz angelegt wird, zuvor alle Referenzen in der Applikation auf das Singleton entfernt wurden. Für “obj3” wird eine neue Referenz angelegt, da die vorher angelegte Instanz von “obj1” und “obj2” gelöscht wurden.

WeakSingleton and References

Eine Weak Reference sollte also nicht unterschätzt werden. Sie kann sinnvoll eingesetzt werden, um beispielsweise Speicherverbrauch oder Zugriffssperren zu reduzieren.

Kommentar eines Lesers:

Stefan: Interessante Idee eine WeakReference mit einem Singleton zu kombinieren. Aber gerade im Multithreaded Umfeld kann es mit WeakReference leicht zu einer Race-Condition kommen, da der Test mit IsAlive und der Zugriff auf das Target zwei getrennte Operationen sind. Ab .NET 4.5 gibt es einen neuen generischen WeakReference-Typen der das Problem durch eine TryGetTarget Methode lösst. Siehe What’s New in the .NET 4.5 Base Class Library ( http://msdn.microsoft.com/en-us/magazine/jj133817.aspx ) im Abschnitt Miscellaneous Improvements

( Dieser Artikel wurde von meinem alten Blog migriert https://thinkfirstdevelopment.wordpress.com/2012/06/05/weakreference-singleton/ )
Written on June 5, 2012