La Cache e oggetti singleton

In alcuni nostri progetti potrebbe apparire del codice come quello che segue.

class C
{
   public static C Current
   {
      C c_currentInstance = (C) HttpContext.Current.Cache["c_currentInstance"];
      if(c_currentInstance == null)
      {
         c_currentInstance = new C();
         HttpContext.Current.Cache.Add("c_currentInstance", c_currentInstance, [cut]);
      }
      return c_currentInstance;
   }

}

Ogni chiamata a C.Current implica una ricerca per chiave ed un cast. Ma tutta questa burocraziona algoritmica è evitabile? Si potrebbe fare così:

class C
{
   static c_currentInstance;
   
   public static C Current
   {
      if(c_currentInstance == null)
      {
         c_currentInstance = new C();
         HttpContext.Current.Cache.Add("c_currentInstance", c_currentInstance, [cut], 
           new CacheItemRemovedCallback(OnCacheItemRemovedCallback));
      }
      return c_currentInstance;
   }

   static void OnCacheItemRemovedCallback([cut])
   {
       c_currentInstance = null;
   }

}

...certo le soluzioni illustrate non stanno considerando gli eventuali problemi di chiamate concorrenti, non era infatti questo il problema trattato nel corrente post. Nel caso di necessità comunque ricordate che potete "Implementare Singleton con Volatile" come proposto da Alessandro.

«novembre»
domlunmarmergiovensab
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910