Looking for c# Keywords? Try Ask4Keywords

C# Language Ленивый, потокобезопасный синглтон (с использованием Double Checked Locking)


пример

Эта поточно-безопасная версия синглета была необходима в ранних версиях .NET, где static инициализация не гарантировалась для потоковой безопасности. В более современных версиях структуры статически инициализированный синглтон обычно предпочтительнее, потому что очень легко сделать ошибки реализации в следующем шаблоне.

public sealed class ThreadSafeSingleton
{
   private static volatile ThreadSafeSingleton instance;
   private static object lockObject = new Object();

   private ThreadSafeSingleton()
   {
   }

   public static ThreadSafeSingleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (lockObject) 
            {
               if (instance == null)
               {
                  instance = new ThreadSafeSingleton();
               }
            }
         }

         return instance;
      }
   }
}

Обратите внимание, что проверка if (instance == null) выполняется дважды: один раз до того, как блокировка будет получена, и один раз после этого. Эта реализация по-прежнему была бы потокобезопасной даже без первой проверки нуля. Однако это будет означать, что блокировка будет получена каждый раз, когда запрашивается экземпляр, и это может привести к потере производительности. Первая нулевая проверка добавляется, чтобы блокировка не была получена, если это не необходимо. Вторая нулевая проверка гарантирует, что только первый поток, получающий блокировку, затем создает экземпляр. Другие потоки найдут экземпляр, который будет заполнен, и пропустите вперед.