posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Pattern singleton che usa static? Tecnicamente sbagliato ...

Personalmente trovo che i pattern soffrano talvolta di essere usati come soluzioni generali, universali. E quando sono usati come tali si incorre in gravi errori.

Nell'implementazione singleton ad esempio, va per la maggiore la versione thread-safe. Giusto, ma che succede se faccio uso di milioni di volte di quell'oggetto? Milioni di controlli che in termini di performance fa certamente una certa differenza.
È quindi chiaro che la protezione thead-safe nell'implementare il singleton (così come altri pattern) è del tutto contestuale e non è possibile definirne una 'universale'.

Il problema non è nuovo e infatti uno degli scopi di ATL (libreria C++) era proprio di risolvere questo problema. E lo fecero in modo egregio: fornire una implementazione differente (tramite l'uso ricorsivo dei template) a seconda del contesto. Ad esempio in COM la protezione con InterlockedIncrement / InterlockedDecrement di AddRef, Release e l'uso di Critical Sections si rendono necessari solo per MTA e non in STA.
ATL provvede a una diversa generazione di codice basandosi sull'apartment in cui l'oggetto desidera vivere, ottenendo codice più snello per dimensione e performance quando i controlli non servono.

Facciamo un altro esempio, ma nel mondo managed. Tecnicamente parlando, l'uso di static per mantenere l'unica istanza è sbagliato. Dato un processo managed, esistono tante copie di dati marcate come 'static' quanti sono gli application domain in cui la classe viene utilizzata.
È quindi possibile allora trovarsi con tante istanze di singleton (contraddizione in termini) quanti sono gli application domain, cosa certamente non desiderabile nella maggior parte dei casi, o perlomeno non by-design.
Le varie soluzioni che si trovano in giro (comprese quelle che io stesso ho citato in passato nel mio blog) dovrebbero essere riviste usando un oggetto kernel come il Mutex (controllandone la ownership per essere certi di una precedente istanza).... sempre che ne valga la pena!

Questo non fa che ribadire il concetto iniziale: non esistono soluzioni universali neppure quando si parla di pattern.

Print | posted on mercoledì 26 aprile 2006 21:17 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET