.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 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.



Comments

  • Simpler

    Posted by richard_deeming on 02/08/2008 01:19pm

    Just use a field initializer - the instance will not be created until the class is first accessed, and the initializer is guaranteed to be thread-safe.
    
    public sealed class Singleton
    {
        private static readonly Singleton _Instance = new Singleton();
        
        private Singleton()
        {
        }
        
        public static Singleton Instance
        {
            get { return _Instance; }
        }
    }

    Reply
  • Just a remark

    Posted by SoftwareTester on 02/03/2008 10:28am

    I've seen a document about threadsafe singleton before http://www.yoda.arachsys.com/csharp/singleton.html I think this one explains more differences and WHY and WHEN to use WHAT way to do it

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Wednesday, September 24, 2014 8:00 AM - 9:00 AM PDT According to a recent Forrester Research report, many companies are choosing low-code platforms over traditional programming platforms, due to the speed with which low-code apps can be assembled and tested. With customer-facing applications on the rise, traditional programming platforms simply can't keep up with the "short schedules and rapid change cycles" required to develop these applications. Check out this upcoming webinar and join Clay Richardson from …

  • Not long ago, security was viewed as one of the biggest obstacles to widespread adoption of cloud-based deployments for enterprise software solutions. However, the combination of advancing technology and an increasing variety of threats that companies must guard against is rapidly turning the tide. Cloud vendors typically offer a much higher level of data center and virtual system security than most organizations can or will build out on their own. Read this white paper to learn the five ways that cloud …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds