<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>.NET Development</title>
        <link>http://blogs.ugidotnet.org/3854/category/.NET Development.aspx</link>
        <description>.NET Development</description>
        <language>it-IT</language>
        <copyright>Lorenzo Melato</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Manning Publications sponsor del corso di RavenDB a Padova il prossimo 28/29 Ottobre</title>
            <link>http://blogs.ugidotnet.org/3854/archive/2013/10/09/manning-publications-sponsor-del-corso-di-ravendb-a-padova-il.aspx</link>
            <description>Dettagli qui:
&lt;a href="http://ynnovahq.com/it/latest-news/it-manning-publications-sponsor-del-corso-di-ravendb-del-2829-ottobre-a-piove-di-sacco-pd/"&gt;http://ynnovahq.com/it/latest-news/it-manning-publications-sponsor-del-corso-di-ravendb-del-2829-ottobre-a-piove-di-sacco-pd/&lt;/a&gt;
&lt;br /&gt;
C'è un ultimo posto disponibile per il corso. Chi si fa avanti e chiude il booking? ;-)
&lt;br /&gt; &lt;img src="http://blogs.ugidotnet.org/3854/aggbug/101688.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Lorenzo Melato</dc:creator>
            <guid>http://blogs.ugidotnet.org/3854/archive/2013/10/09/manning-publications-sponsor-del-corso-di-ravendb-a-padova-il.aspx</guid>
            <pubDate>Wed, 09 Oct 2013 13:58:27 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/3854/archive/2013/10/09/manning-publications-sponsor-del-corso-di-ravendb-a-padova-il.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/3854/comments/commentRss/101688.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/3854/services/trackbacks/101688.aspx</trackback:ping>
        </item>
        <item>
            <title>Pubblicata l'agenda del corso di RavenDB del prossimo Ottobre a Padova</title>
            <link>http://blogs.ugidotnet.org/3854/archive/2013/07/29/pubblicata-lagenda-del-corso-di-ravendb-del-prossimo-ottobre-a.aspx</link>
            <description>La trovate &lt;a href="http://ynnovahq.com/it/latest-news/it-agenda-di-massima-del-corso-di-ravendb-di-ottobre-2013"&gt;qui&lt;/a&gt;.

L.&lt;img src="http://blogs.ugidotnet.org/3854/aggbug/101627.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Lorenzo Melato</dc:creator>
            <guid>http://blogs.ugidotnet.org/3854/archive/2013/07/29/pubblicata-lagenda-del-corso-di-ravendb-del-prossimo-ottobre-a.aspx</guid>
            <pubDate>Mon, 29 Jul 2013 16:13:12 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/3854/archive/2013/07/29/pubblicata-lagenda-del-corso-di-ravendb-del-prossimo-ottobre-a.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/3854/comments/commentRss/101627.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/3854/services/trackbacks/101627.aspx</trackback:ping>
        </item>
        <item>
            <title>Chi sarebbe interessato ad un corso su RavenDB a Padova?</title>
            <link>http://blogs.ugidotnet.org/3854/archive/2013/07/25/chi-sarebbe-interessato-ad-un-corso-su-ravendb-a-padova.aspx</link>
            <description>In azienda stiamo cercando di organizzare un corso di due giorni su RavenDB a Padova, indicativamente nel corso del prossimo mese di Ottobre.&lt;br /&gt;&lt;br /&gt;
Il docente, d'eccezione, sarà un teacher ufficiale di RavenDB.&lt;br /&gt; 
Il corso sarà probabilmente orientato all'ultima versione, la 2.5, e partirà dalle basi per arrivare fino alle funzionalità più avanzate.&lt;br /&gt; 
C'è l'intenzione di riservare del tempo anche alle best practice per l'utilizzo con Windows Azure.&lt;br /&gt;&lt;br /&gt;

Chi fosse interessato mi può contattare attraverso il &lt;a href="http://www.linkedin.com/in/lorenzomelato"&gt;mio profilo linkedin&lt;/a&gt; o lasciando un commento qui sul blog.&lt;br /&gt;&lt;br /&gt; 

Il corso si farà se riusciremo a trovare almeno dieci persone interessate.&lt;br /&gt;&lt;br /&gt;

Ciao!&lt;br /&gt;&lt;img src="http://blogs.ugidotnet.org/3854/aggbug/101625.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Lorenzo Melato</dc:creator>
            <guid>http://blogs.ugidotnet.org/3854/archive/2013/07/25/chi-sarebbe-interessato-ad-un-corso-su-ravendb-a-padova.aspx</guid>
            <pubDate>Thu, 25 Jul 2013 10:06:32 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/3854/archive/2013/07/25/chi-sarebbe-interessato-ad-un-corso-su-ravendb-a-padova.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/3854/comments/commentRss/101625.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/3854/services/trackbacks/101625.aspx</trackback:ping>
        </item>
        <item>
            <title>Il punto su Singleton</title>
            <link>http://blogs.ugidotnet.org/3854/archive/2007/07/08/84929.aspx</link>
            <description>&lt;font size="2" face="Tahoma"&gt;Proprio in questi giorni mi è capitato di leggere un interessante articolo sull'integrazione di NHibernate con ASP.NET (che trovate &lt;a target="_blank" href="http://www.codeproject.com/aspnet/NHibernateBestPractices.asp"&gt;qui)&lt;/a&gt;. Analizzando il codice allegato all'articolo in questione mi è caduto l'occhio su una particolare implementazione del pattern &lt;strong&gt;Singleton &lt;/strong&gt;in C#. Tra i commenti, l'autore citava un link ad un &lt;a target="_blank" href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;articolo&lt;/a&gt; che avevo già letto di sfuggita un po' di tempo fa al quale solo ora sono riuscito a dare il peso che merita. &lt;/font&gt;
&lt;p&gt; &lt;font size="2" face="Tahoma"&gt;Ricalco di seguito qualche concetto e qualche riga di approfondimento, giusto a pro memoria e per reference in italiano.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;font size="2" face="Tahoma"&gt;In sostanza un Singleton è una classe che permette la creazione di una singola istanza di se stessa (requisito di resource management [1]) e fornisce un unico, semplice accesso pubblico a detta istanza (requisito di accessibilità [1]).&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;font size="2" face="Tahoma"&gt;Obiettivo del Singleton è &lt;strong&gt;spostare la responsabilità dell'esistenza di una ed una sola istanza di una determinata classe dallo sviluppatore alla classe stessa&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;font size="2" face="Tahoma"&gt;Un tipico requisito di un Singleton è che l'istanza non sia creata finchè non ce n'è reale necessità, che sia cioè "lazy-created".&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;font size="2" face="Tahoma"&gt;Tutte le implementazioni del Singleton condividono alcune caratteristiche:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt; &lt;font size="2" face="Tahoma"&gt;
    &lt;li&gt; &lt;strong&gt;Un unico costruttore, privato e senza parametri.&lt;/strong&gt; Per non permettere ad altre classi di instanziarlo direttamente e per non permetterne l'uso come classe base in una gerarchia di ereditarietà. Tipicamente il Singleton è &lt;em&gt;sealed&lt;/em&gt;, anche se non servirebbe, per il motivo che abbiamo appena citato, ma sembra che segnare la classe sealed aiuti il compilatore a ottimizzare meglio [2]; &lt;/li&gt;
    &lt;li&gt; &lt;strong&gt;Un campo statico&lt;/strong&gt; che mantiene un riferimento alla singola istanza del Singleton; &lt;/li&gt;
    &lt;li&gt; &lt;strong&gt;Un metodo o una proprietà pubblici&lt;/strong&gt; per ottenere il riferimento all'istanza del Singleton ed eventualmente crearla, se non ancora creata;&lt;/li&gt;
    &lt;/font&gt;&lt;/ul&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Vediamo di seguito qualche implementazione del pattern Singleton con un occhio di riguardo alla "thread-safety" e alla "lazyness", come consigliato in [2].&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;
    &lt;p&gt;&lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;L'implementazione classica... non thread safe&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p class="CodeFormatContainer"&gt; &lt;/p&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton1&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton1 _instance = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Singleton1() { }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton1 Instance&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                _instance = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton1();&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _instance;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;pre&gt; &lt;/pre&gt;
&lt;/div&gt;
    &lt;p&gt; &lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;L'implementazione proposta è la classica descritta in [3], semplicemente tradotta da C++ a C#.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;La proprietà Instance alla riga 7 garantisce il requisito di accessibilità, è infatti l'unico punto di accesso pubblico all'istanza. Il codice all'interno della proprietà garantisce il requisito di resource management definito e cioè che esista una sola istanza della classe, il getter controlla infatti la preventiva esistenza dell'istanza e la crea solo ed esclusivamente se non è già stata creata, altrimenti restituisce l'istanza già esistente.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma" /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma" /&gt; &lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;In uno scenario single-thread il codice in questione funziona ed è perfettamente legale. In scenari multi-thread iniziano i problemi... questa implementazione non è thread safe, due o più thread potrebbero contemporaneamente valutare il test alla riga 11 come vero e creare più istanze della classe, &lt;strong&gt;violando il requisito di resource management&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Rigirando la frittata, anche se a mio parere non ci sono forti motivazioni (ad esempio straordinari aumenti di performance) per un approccio del genere, nel tipico caso di Singleton immutabile e nel caso in cui la costruzione del Singleton sia poco onerosa, è possibile chiudere un occhio riguardo la violazione del requisito di resource management, lasciando al garbage collector l'onore e l'onere di eliminare una eventuale "altra istanza" lasciata orfana di riferimento dalla fortuita costruzione di una seconda istanza e utilizzare, quindi, questa implementazione.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;
    &lt;p&gt;&lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;Un passo avanti, garantiamo la thread-safety&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p class="CodeFormatContainer"&gt; &lt;/p&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton2&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton2 _instance = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Object syncObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; Object();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Singleton2() { }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton2 Instance&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd"&gt;lock&lt;/span&gt; (syncObject)&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                    _instance = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton2();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; _instance;&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;pre&gt; &lt;/pre&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;L'implementazione è effettivamente thread safe, due o più thread non possono accedere contemporaneamente all'area protetta da &lt;font color="#0000ff"&gt;lock &lt;/font&gt;quindi solo il primo thread che entrerà nel lock potrà creare l'istanza del singleton.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Il codice soffre però un problema di performance, è infatti richiesto un lock &lt;strong&gt;per ogni&lt;/strong&gt; richiesta dell'istanza, anche nel caso in cui l'istanza sia già stata creata.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt; &lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;Thread safety, lock, performance, volatile e MemoryBarrier()&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p class="CodeFormatContainer"&gt; &lt;/p&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton3&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;volatile&lt;/span&gt; Singleton3 _instance = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Object syncObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; Object();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Singleton3() { }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton3 Instance&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                &lt;span class="kwrd"&gt;lock&lt;/span&gt; (syncObject)&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    {&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                        _instance = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton3();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _instance;&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;A differenza dell'esempio precedente, il &lt;font color="#0000ff"&gt;lock&lt;/font&gt; viene eseguito solo la prima volta che viene richiesta l'istanza. Infatti l'&lt;font color="#0000ff"&gt;if&lt;/font&gt; più esterno (alla riga 12) serve proprio a verificare che l'istanza sia già stata creata ed in tal caso l'ingresso nel &lt;font color="#0000ff"&gt;lock&lt;/font&gt; introdurrebbe solo un inutile overhead. Questa semplice modifica rispetto all'esempio precendente ha un chiaro impatto sulle performance, l'utilizzo di &lt;font color="#0000ff"&gt;lock&lt;/font&gt; è utile in effetti solo nella fase iniziale in cui l'istanza non è ancora stata creata, quando cioè è indispensabile la sincronizzazione, e di conseguenza è un inutile spreco di tempo per tutto il resto del ciclo di vita del singleton in cui viene semplicemente restituita l'istanza già creata. &lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Merita particolare attenzione in questa implementazione l'utilizzo di &lt;font color="#0000ff"&gt;volatile&lt;/font&gt; nella dichiarazione di _instance (riga 3)... ma prima di entrare nel merito forse vale la pena di ricordare le 3 regole fondamentali a cui i modelli di memoria (anche quello del .NET Framework) devono sottostare:&lt;/font&gt;&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Una lettura o una scrittura da un determinato thread ad una determinata locazione di memoria non può essere spostata temporalmente più avanti di una scrittura dallo stesso thread alla stessa locazione;&lt;/font&gt;&lt;/li&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Le letture non possono essere spostate temporalmente più indietro dell'acquisizione di un lock;&lt;/font&gt;&lt;/li&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Le scritture non possono essere spostate temporalmente più avanti del rilascio di un lock;&lt;/font&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Il modello di memoria del .NET Framework, oltre alle 3 regole citate, suddivide le tipologie di accesso alla memoria in "accessi ordinari" e "accessi volatile". Per gli accessi volatile sono definite le due regole seguenti:&lt;/font&gt;&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Letture e scritture non possono essere spostate temporalmente più indietro di una lettura volatile;&lt;/font&gt;&lt;/li&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Letture e scritture non possono essere spostate temporalmente più avanti di una scrittura volatile.&lt;/font&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Conseguenza di queste regole è, di fatto, l'inibizione del riordino degli accessi alla memoria, una particolare ottimizzazione applicata dai compilatori e dalle CPU non x86 per ottimizzare l'esecuzione del codice.&lt;br /&gt;
    Altra conseguenza è che viene forzato l'aggiornamento della variabile dichiarata volatile al valore più recente prima che questa venga applicata all'interno di un particolare contesto.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Ora... cosa sarebbe potuto succedere se _instance non fosse stata dichiarata volatile?&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Dal punto di vista del rispetto dei requisiti di accessibilità e di resource management assolutamente niente. Infatti, il requisito di resource management è garantito dalla presenza del secondo check su _instance (riga 16) e dal rispetto da parte del memory model della seconda regola fondamentale. Si supponga di avere 2 thread:&lt;/font&gt;&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Il thread 1 passa il primo if (riga 12), l'esecuzione viene interrotta e passa al thread 2; &lt;/font&gt;&lt;/li&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Il thread 2 passa il primo if, entra nel lock, passa il secondo if e crea l'istanza; &lt;/font&gt;&lt;/li&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Il thread 1 riprende l'esecuzione ed entra nel lock. La seconda regola fondamentale dei modelli di memoria dice che: "le letture non possono essere spostate temporalmente più indietro dell'acquisizione di un lock" e di conseguenza che _instance avrà sicuramente, a questo punto, l'ultimo valore pubblicato dal thread 2 prima di rilasciare il lock. L'if alla riga 16 verificherà che _instance è diverso da null e il thread 1 proseguirà l'esecuzione restituendo l'istanza precedentemente creata da thread 2.&lt;/font&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;In realtà, &lt;strong&gt;un problema subdolo si nasconde&lt;/strong&gt; nel corpo dell'if alla riga 16 e precisamente nel codice che va a creare l'istanza di Singleton3... ed è proprio in questo caso che &lt;font color="#0000ff"&gt;volatile&lt;/font&gt; ci viene in aiuto. Si supponga di avere il codice seguente:&lt;/font&gt;&lt;/p&gt;
    &lt;p class="CodeFormatContainer"&gt; &lt;/p&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton3&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;volatile&lt;/span&gt; Singleton3 _instance = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Object syncObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; Object();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; _message;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Singleton3() { _message = "Hello World!"; }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton3 Instance&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   10:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                &lt;span class="kwrd"&gt;lock&lt;/span&gt; (syncObject)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                        _instance = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton3();&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                    }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _instance;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Su architetture IA64, che permettono il riordino delle scritture in memoria, potrebbe accadere che, all'interno del corpo dell'if alla riga 19, le scritture vengano riordinate in maniera tale che la scrittura di _message all'interno del costruttore possa essere spostata temporalmente più avanti della scrittura di _instance. La lettura di _instance (alla riga 13) non è protetta da lock, potrebbe quindi accadere che un secondo thread possa accedere all'istanza di Singleton3 prima che il costruttore abbia concluso l'inizializzazione.&lt;br /&gt;
    L'utilizzo di volatile su _instance ci mette al riparo da questo problema in virtù della regola introdotta dal memory model del .NET Framework che dice: "Letture e scritture non possono essere spostate temporalmente più avanti di una scrittura volatile", garantendo, di conseguenza, la sequenzialità delle scritture nel blocco di costruzione dell'istanza, viene garantita la corretta inizializzazione di Singleton3 anche in scenari multi-thread.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;L'implementazione precedente &lt;strong&gt;è thread-safe, è lazy-load ed è performante...&lt;/strong&gt; ma possiamo fare ancora un pochino di più!&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Quello che possiamo fare è &lt;strong&gt;rimuovere il modificatore volatile dalla dichiarazione di _instance&lt;/strong&gt; e utilizzare una &lt;a href="http://msdn2.microsoft.com/it-it/library/system.threading.thread.memorybarrier(VS.80).aspx"&gt;MemoryBarrier&lt;/a&gt; esplicita subito prima della pubblicazione dell'istanza di Singleton3 come nell'esempio seguente:&lt;/font&gt;&lt;/p&gt;
    &lt;p class="CodeFormatContainer"&gt; &lt;/p&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton3&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton3 _instance = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Object syncObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; Object();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; _message;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Singleton3() { _message = "Hello World!"; }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton3 Instance&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   10:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                &lt;span class="kwrd"&gt;lock&lt;/span&gt; (syncObject)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (_instance == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                        Singleton3 newValue = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton3();&lt;/pre&gt;
    &lt;pre style="color: red;"&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                        System.Threading.Thread.MemoryBarrier();&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                        _instance = newValue;&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                    }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _instance;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;/pre&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Questo approccio è &lt;strong&gt;molto più efficiente&lt;/strong&gt; dell'ultilizzo del modificatore volatile perchè, in realtà, &lt;strong&gt;ogni scrittura o lettura volatile è una memory barrier!&lt;/strong&gt; anche dove non ne abbiamo bisogno!&lt;br /&gt;
    Nel nostro caso l'obiettivo è soltanto avere la sicurezza che le scritture all'interno del costruttore vengano eseguite prima della pubblicazione dell'istanza agli altri thread (e processori). &lt;strong&gt;MemoryBarrier()&lt;/strong&gt; ci assicura che "nessuna scrittura possa essere spostata temporalmente più avanti della chiamata a MemoryBarrier()" e ci permette quindi di garantire la consistenza dell'istanza risparmiando la dichiazione volatile di _instance.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;&lt;strong&gt;E se utilizziamo il .NET Framework 2.0?&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Con l'introduzione del .NET Framework 2.0 il modello di memoria è stato riveduto e corretto al fine si supportare gli sviluppatori nel passaggio alle nuove architetture IA64. Rimangono buone tutte le precedenti regole e alcune di nuove sono state introdotte tra cui una in particolare:&lt;/font&gt;&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Le scritture non possono essere spostate temporalmente più avanti di altre scritture dallo stesso thread. &lt;/font&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Questa regola &lt;strong&gt;ci permette di evitare sia la dichiarazione volatile di _instance sia la chamata a MemoryBarrier()&lt;/strong&gt;, risolvendo a livello di memory model la corretta serializzazione delle scritture del costruttore rispetto alla pubblicazione dell'istanza.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;
    &lt;p&gt;&lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;Thread safe senza lock. Lazyness (con riserva)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;div class="CodeFormatContainer"&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton4&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Singleton4 _instance = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton4();&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;font color="#0000ff"&gt;private&lt;/font&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton4() { }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;font color="#0000ff"&gt;private&lt;/font&gt; Singleton4() { }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton4 Instance&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _instance;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;/div&gt;
    &lt;/div&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Il singleton dell'esempio qui sopra è thread safe e lazy-created (con riserva).&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;La lazyness è supportata da una funzionalità del CLR che garantisce che il type initializer venga eseguito "prima" dell'accesso ad un qualsiasi membro statico della classe. Nel nostro caso, subito prima del primo accesso alla proprietà statica &lt;em&gt;Instance&lt;/em&gt;, il type initializer verrà eseguito e il campo statico &lt;em&gt;_instance&lt;/em&gt; verrà inizializzato con una istanza di Singleton4. Il type initializer verrà eseguito però anche &lt;strong&gt;nel caso si acceda ad un qualsiasi altro campo o proprietà statica denifito nella classe&lt;/strong&gt; violando (da qui la riserva), di fatto, la lazyness di Instance... Attenzione! potrebbe non essere il comportamento desiderato in fase di design.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Altra importante questione riguardante la lazyness di Singleton4 è la presenza del costruttore statico (riga 5, costruttore esplicito). La presenza del costruttore esplicito garantisce che la classe &lt;strong&gt;non venga decorata&lt;/strong&gt; con il flag &lt;strong&gt;beforefieldinit&lt;/strong&gt; in fase di compilazione. Il flag beforefiledinit abilita il runtime ad ottimizzare l'esecuzione del type initializer scegliendo autonomamente il momento migliore per eseguirlo, garantendone comunque l'esecuzione prima dell'accesso ad un qualunque campo statico della classe. Noi non abbiamo quindi modo di determinare precisamente il momento in cui il type initializer viene eseguito, di conseguenza la lazyness è violata. &lt;strong&gt;Senza il flag beforefieldinit&lt;/strong&gt; il runtime &lt;strong&gt;DEVE &lt;/strong&gt;eseguire il type initializer&lt;strong&gt; immediatamente prima&lt;/strong&gt; dell'accesso ad un qualunque campo statico della classe [6].&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;La thread safety è supportata da una specifica del CLR che garantisce il fatto che il type initializer venga eseguito una ed una sola volta, &lt;strong&gt;anche in ambienti multithreaded&lt;/strong&gt;. Il runtime, infatti, acquisisce un lock PRIMA di eseguire il type initializer, rendendo l'inizializzazione di &lt;em&gt;_instance&lt;/em&gt; sincronizzata [6].&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt; &lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;Thread safe senza lock. Lazy-created (garantito)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p class="CodeFormatContainer"&gt; &lt;/p&gt;
    &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Singleton5&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Singleton5() { }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Singleton5 Instance&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Nested._instance;&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Nested&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    {&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; Nested() { }&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt; &lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; Singleton5 _instance = &lt;span class="kwrd"&gt;new&lt;/span&gt; Singleton5();&lt;/pre&gt;
    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    }&lt;/pre&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;
    &lt;/div&gt;
    &lt;font size="2" face="Tahoma"&gt;Il singleton dell'esempio qui sopra è thread safe (vedi le stesse motivazioni del precedente esempio) e lazy-created in ogni circostanza.&lt;/font&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;La lazyness è infatti &lt;strong&gt;garantita&lt;/strong&gt; dal fatto che il type initializer di&lt;em&gt; _instance &lt;/em&gt;viene eseguito solo ed esclusivamente prima del primo accesso ai membri statici della classe Nested (che può essere fatto solo dallo stesso Singleton5), costruita solo per questo scopo e invisibile all'esterno di Singleton5. L'accesso ad una qualsiasi altro membro statico di Singleton5 non influenza l'inizializzazione di _instance.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt; &lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Nel caso di decida di utilizzare l'implementazione Singleton4 o Singleton5 bisogna fare particolarmente attenzione alla particolare gestione delle eccezioni dei type initializer statici:&lt;/font&gt;&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Qualsiasi eccezione sollevata all'interno del costruttore statico viene automaticamente wrappata da una eccezione di tipo TypeInitializationException, l'eccezione originale è comunque disponibile attraverso la proprietà InnerException di TypeInitializationException; &lt;/font&gt; &lt;/li&gt;
        &lt;li&gt;&lt;font size="2" face="Tahoma"&gt;Il runtime, nel caso venga sollevata una eccezione nel costruttore statico, non tenterà di invocare una seconda volta il costruttore statico, rendendo, probabilmente, la stessa eccezione fatale per l'intera applicazione [6].&lt;/font&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt; &lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;Potete scaricare i sorgenti d'esempio del post &lt;/font&gt;&lt;a href="http://www.ynnova.it/Singleton/testsingleton.zip"&gt;&lt;font size="2" face="Tahoma"&gt;qui&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Tahoma"&gt;.&lt;/font&gt;&lt;/p&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma" /&gt; &lt;/p&gt;
    &lt;font size="4" face="Tahoma"&gt;&lt;strong&gt;Bibliografia&lt;/strong&gt;&lt;/font&gt;
    &lt;p&gt;&lt;font size="2" face="Tahoma"&gt;[1] Adrian Florea - &lt;/font&gt;&lt;a href="http://www.ugidotnet.org/articles/articles_read.aspx?ID=76"&gt;&lt;font size="2" face="Tahoma"&gt;L'individuazione via reflection delle classi singleton all'interno del Framework .NET&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[2] Jon Skeet - &lt;/font&gt;&lt;a href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;&lt;font size="2" face="Tahoma"&gt;Implementing the Singleton Pattern in C#&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[3] Gamma, Helm, Johnson, Vlissides - &lt;/font&gt;&lt;a href="http://www.internetbookshop.it/code/9788871921501/ZZZ/DESIGN-PATTERNS.html"&gt;&lt;font size="2" face="Tahoma"&gt;Design Patters, Elementi per il riuso di software a oggetti&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[4] Alessandro Marotta Rizzo - &lt;/font&gt;&lt;a href="http://www.ugidotnet.org/articles/articles_read.aspx?ID=97"&gt;&lt;font size="2" face="Tahoma"&gt;Implementare Singleton con Volatile&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[5] Eric Gunnerson - &lt;/font&gt;&lt;a href="http://www.internetbookshop.it/book/9781590595015/GUNNERSON-ERIC-WIENHOLT-NICK-/A-PROGRAMMERS-INTRODUCTION-TO-C-20.html"&gt;&lt;font size="2" face="Tahoma"&gt;A programmer's introduction to C# 2.0&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[6] K. Scott Allen -  &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/01/StaticsinNET/default.aspx"&gt;&lt;font size="2" face="Tahoma"&gt;Get a Charge From Statics with Seven Essential Programming Tips&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[7] Microsoft -  &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/netframework/ecma/"&gt;&lt;font size="2" face="Tahoma"&gt;ECMA C# and Common Language Infrastructure Standards&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
    &lt;font size="2" face="Tahoma"&gt;[8] Vance Morrison -  &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/05/10/MemoryModels/default.aspx"&gt;&lt;font size="2" face="Tahoma"&gt;Understand the Impact of Low-Lock Techniques in Multithreaded Apps&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:162c11c3-4fa7-462e-aaa9-4e5345bc9104" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/design+patterns"&gt;design patterns&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/gof"&gt;gof&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/singleton"&gt;singleton&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/c%23"&gt;c#&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/3854/aggbug/84929.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Lorenzo Melato</dc:creator>
            <guid>http://blogs.ugidotnet.org/3854/archive/2007/07/08/84929.aspx</guid>
            <pubDate>Sun, 08 Jul 2007 13:15:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/3854/archive/2007/07/08/84929.aspx#feedback</comments>
            <slash:comments>26</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/3854/comments/commentRss/84929.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/3854/services/trackbacks/84929.aspx</trackback:ping>
        </item>
        <item>
            <title>Visualizzare linee guida nell'editor di testo di Visual studio</title>
            <link>http://blogs.ugidotnet.org/3854/archive/2007/07/05/84755.aspx</link>
            <description>&lt;p /&gt; &lt;p&gt;&lt;font size="2"&gt;Interessante funzionalità di Visual Studio 2002, 2003 e 2005 della quale non ero a conoscenza, ma molto molto comoda... E' possibile visualizzare una o più guideline nell'editor di testo di visual studio aggiungendo una semplice stringa ad una chiave di registro, chissà poi perchè non l'hanno messa tra le opzioni dell'editor...&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Aprite regedit e navigate alla chiave seguente:&lt;/p&gt; &lt;p&gt;[HKEY_CURRENT_USER]\Software\Microsoft\VisualStudio\8.0\Text Editor&lt;/p&gt; &lt;p&gt;create ora una nuova stringa REG_SZ e chiamatela Guides, doppio click sulla stringa appena creata e aggiungete:&lt;/p&gt; &lt;p&gt;RGB(230,230,230) 80, 120&lt;/p&gt; &lt;p&gt;con RGB(...) si sceglie il colore della o delle linee. 80 e 120 aggiungono 2 guidelines rispettivamente alla colonna 80 e 120 dell'editor di testo.&lt;/p&gt; &lt;p&gt;Un consiglio, scegliete un colore molto chiaro (se lo sfondo è bianco) o comunque un colore che non dia troppo fastidio.&lt;/p&gt;
&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:41c41864-a875-4b41-9583-f4609d4efedb" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/visual+studio"&gt;visual studio&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/3854/aggbug/84755.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Lorenzo Melato</dc:creator>
            <guid>http://blogs.ugidotnet.org/3854/archive/2007/07/05/84755.aspx</guid>
            <pubDate>Thu, 05 Jul 2007 20:52:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/3854/archive/2007/07/05/84755.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/3854/comments/commentRss/84755.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/3854/services/trackbacks/84755.aspx</trackback:ping>
        </item>
        <item>
            <title>URL rewriting, questo sconosciuto</title>
            <link>http://blogs.ugidotnet.org/3854/archive/2006/03/08/36373.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;In questo articolo &lt;A href="http://www.ugidotnet.org/articles/articles_read.aspx?ID=112"&gt;http://www.ugidotnet.org/articles/articles_read.aspx?ID=112&lt;/A&gt;&amp;nbsp;il 
buon &lt;A href="http://www.boschin.it/imho"&gt;Andrea&amp;nbsp;Boschin&lt;/A&gt;&amp;nbsp;affronta 
con estrema lucidità ed efficacia il problema dell' URL rewriting e il Sitemap 
provider di ASP.NET.&lt;/P&gt;
&lt;P&gt;Da leggere.&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/3854/aggbug/36373.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Lorenzo Melato</dc:creator>
            <guid>http://blogs.ugidotnet.org/3854/archive/2006/03/08/36373.aspx</guid>
            <pubDate>Wed, 08 Mar 2006 15:20:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/3854/archive/2006/03/08/36373.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/3854/comments/commentRss/36373.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/3854/services/trackbacks/36373.aspx</trackback:ping>
        </item>
    </channel>
</rss>