.NET Tip: Creating a Thread-Safe Singleton | CodeGuru

.NET Tip: Creating a Thread-Safe Singleton

A singleton is used to ensure that there is only one instance of a class created. A singleton also provides the single point of access to that one instance of the class. Singletons can be used for a wide range of reasons, from a better means of managing global variables to creating abstract factories to […]

Written By
CodeGuru Staff
CodeGuru Staff
Feb 1, 2008
2 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

A singleton is used to ensure that there is only one instance of a class created. A singleton also provides the single point of access to that one instance of the class. Singletons can be used for a wide range of reasons, from a better means of managing global variables to creating abstract factories to maintaining a state machine for you application. Regarless of your use of the singleton, I will show you how to create a bare-bones singleton that can be created in a thread-safe manner. Here is the code:

public sealed class Singleton
{
   private static Singleton _Instance = null;
   private static readonly object _Lock = new object();

   private Singleton()
   {
   }

   public static Singleton Instance
   {
      get
      {
         lock (_Lock)
         {
            if (_Instance == null)
               _Instance = new Singleton();

            return _Instance;
         }
      }
   }
}

First, the class is marked as sealed so that another class can’t derive from it and change its behavior. This simple version of a singleton has only two private variables. One is used to store the actual instance of the Singleton class and the other is used as a lock to ensure that multiple threads cannot create new instances of the singleton at the same time. The contrstructor is declared as private so that there is no way to create a Singleton other than using the Instance method. The Instance method uses the _Lock variable to make sure no other threads are retrieving the instance of the singleton at the same time. If the lock is successful, a new instance of Singleton is created if it does not already exist, and then that instance is returned. To extend the Singleton class, you simply need to add properties and methods that would be appropriate for your application. Using the private constructor and Instance method will guarantee that only one copy of your class is ever active in your application.

The Singleton pattern is one of the orginal “Gang of Four” design patterns. I would highly recommend you read Design Patterns by Gamma, Helm, Johnson, and Vlissides to learn more about patters.

About the Author

Jay Miller is a Software Engineer with Electronic Tracking Systems, a company dedicated to robbery prevention, apprehension, and recovery based in Carrollton, Texas. Jay has been working with .NET since the release of the first beta and is co-author of Learn Microsoft Visual Basic.Net In a Weekend. Jay can be reached via email at jmiller@sm-ets.com.

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.