Is this a valid and optimized way to avoid double checked locks:
public class SomeBaseClass
{
     protected static object InitializeLock = new object();
     protected static bool IsInitialized = false;
     public void SomeFunction()
     {
         if (!IsInitialized)
         {
             System.Threading.Thread.MemoryBarrier();
             lock (InitializeLock)
             {
                 // do init stuff
                 IsInitialized = true;
             }
     }
     //Do stuff that have to happen when function is called
    }
}
With this being the double-checked alternative:
public class SomeBaseClass
{
     protected static object InitializeLock = new object();
     protected static bool IsInitialized = false;
     public void SomeFunction()
     {
         if (!IsInitialized)
         {
             lock (InitializeLock)
             {
                 if (!IsInitialized)
                 {                              
                     // do init stuff
                     IsInitialized = true;
                 }
             }
         }
     //Do stuff that have to happen when function is called
    }
}